Se você vir : integer expression expected
, é um sinal de que o que está antes do :
terminar com um caractere retorno de carro . Um retorno de carro faz com que seu terminal substitua a linha atual pelo texto subseqüente, portanto, se um campo contiver algo como 1234␍
, em que ␍
é um retorno de carro, o shell exibirá a mensagem de erro 1234␍: integer expression expected
e 1234
é sobrescrito por : in
.
Você está obtendo um retorno de carro porque seu arquivo de entrada é um arquivo de texto do Windows e este é o último campo na linha. Para usar o arquivo no Linux ou no Cygwin, você precisa convertê-lo em um arquivo de texto Unix. Os arquivos de texto do Windows usam a sequência de dois caracteres CR-LF (retorno de carro, avanço de linha) para marcar o final de uma linha. Arquivos de texto Unix usam o único caractere LF. Então, quando o Linux vê um arquivo de texto do Windows, ele vê que cada linha é terminada por um caractere CR - que é um caractere válido, mas raramente é um caractere desejado, e não é um caractere válido em um inteiro.
A mensagem 9.99: integer expression expected
mostra que há uma linha em que 9.99
está no nono campo. De seus dados de exemplo, parece que isso é esperado no 8º campo, então você tem uma linha com dados inválidos (provavelmente um espaço espúrio, um dos campos de nome).
Seu script é muito complicado. Não verifique se o argumento é um arquivo regular: isso não serve a nenhum propósito útil (o redirecionamento falhará se o arquivo não existir) e torna impossível usar um pipe como entrada. Não use cut
para analisar campos: read
pode fazer isso (assumindo que não há campos vazios). O fragmento || [[ -n $LINE ]]
não faz nada de útil (mas certifique-se de que sua entrada seja um arquivo de texto válido; em um arquivo de texto não vazio válido, o último caractere é LF). Use aritmética de shell em vez de expr
. Como princípio geral, use aspas duplas em torno de substituições de variáveis (embora aqui não importe dados válidos - mas considere o que poderia acontecer se alguém escrevesse *
em um campo). Reescrita não testada:
#!/bin/bash
set -e
sum=0
echo "#Name Surname City Amount"
while read -r firstName lastName city f4 state f6 f7 f8 amount; do
if [ "$amount" -gt 999 ] ; then
case "$state" in
N[YCEJ])
echo "$firstName $lastName $state $city $amount"
sum=$((sum + amount));;
esac
fi
done < "$1"
echo ""
echo "The sum is all printed amounts is $sum"
echo ""
Isso seria mais fácil como um script awk. Mais uma vez, não testado.
awk '
$9 > 999 && $5 ~ /^[N[YCEJ]]$/ {
print $1, $2, $5, $3, $9;
sum += $9;
}
END { print "\nThe sum is all printed amounts is " sum }
' <"$1"