Compare dois números lidos de um arquivo

1

Eu tenho um script que lê um arquivo com um formato padrão, em que a 9ª palavra é um número. Eu estou tentando comparar o número que é lido do arquivo. Eu sou capaz de ler a linha corretamente e funciona exatamente como eu quero. Mas recebo um erro que diz:

./age.sh: line 8: [: age: integer expression expected

Aqui está o meu script:

#!/bin/bash
if [ -f $1 ] ;
then
    while read -r LINE || [[ -n $LINE ]]; do
        name=$( echo $LINE | cut -d " " -f1 -f2)
        ago=$( echo $LINE | cut -d " " -f9)     
        echo "$name ----- $age"
        if [ $ago -gt 30 ] ; then
            echo "You get a discount"
        fi
    done < $1
    else
        echo "No file found"
fi

Aqui está um exemplo de arquivo de entrada

#FirstName LastName SuperheroName Powers Weapons City Enemy isOutOfEarth Age
Bruce Wayne Batman Martial_arts No_Guns Gowtham Joker No 31
Clark Kent Superman Extreme_strength None Metropolitan Lex_Luther Yes 32
Oliver Queen Green_arrow Accuracy Bow_and_Arrow Star_city Cupid No 30
    
por gkmohit 16.07.2014 / 14:43

4 respostas

2

O erro específico que você está recebendo é porque seu script também está processando o cabeçalho do arquivo. Uma solução fácil seria pular as linhas que começam com # :

#!/bin/bash
if [ ! -f "$1" ]; then
   echo "No file found"
   exit 1
fi

## Use grep -v to print lines that don't match the pattern given. 
grep -v '^#' "$1" | 
while read -r LINE || [ -n "$LINE" ]; do
   name=$( echo "$LINE" | cut -d " " -f1,2)
   age=$( echo "$LINE" | cut -d " " -f9)
   echo "$name ----- $age"
   if [ "$age" -gt 30 ]; then
      echo "You got a discount"
   fi
done

No entanto, como presumivelmente você também desejará fazer coisas com suas outras colunas, eu leria todas elas diretamente em variáveis:

#!/bin/bash
if [ ! -f "$1" ]; then
   echo "No file found"
   exit 1
fi

## read can take multiple values and splits the input line on whitespace
## automatically. Each field is assigned to one of the variables given.
## If there are more fields than variable names, the remaining fields
## are all assigned to the last variable.
grep -v '^#' "$1" | while read -r first last super powers weapons city enemy isout age; do
   echo "$first $last  ----- $age"
   if [ "$age" -gt 30 ]; then
      echo "You got a discount"
   fi
done
    
por 16.07.2014 / 15:58
0
#!/bin/bash 
if [ ! -f "$1" ]; then
   echo "No file found"
   exit 1
fi

exec < $1

while read -r LINE || [ -n "$LINE" ]; do
   name=$( echo "$LINE" | cut -d " " -f1,2)
   age=$( echo "$LINE" | cut -d " " -f9)
   echo "$name ----- $age"
   if [ "$age" -gt 30 ]; then
      echo "You got a discount"
   fi
done
    
por 16.07.2014 / 15:21
0

Então, foi o que eu fiz:

#!/bin/bash

if [ -f $1 ] ; 
then 
    sum=0
    echo "#FirstName LastName City Age" 
    while read -r LINE || [[ -n $LINE ]]; do 
       name=$( echo $LINE | cut -d " " -f1 -f2) 
       city=$( echo $LINE | cut -d " " -f3) 
       age=$( echo $LINE | cut -d " " -f9) 
       check=$( echo $amount | grep -c "[0-9]") 
       if [ $check -gt 0 ]; then 
         if [ $age -gt 30 ] ; then 
            echo "You get a discount" 
         fi 
       fi 
    done < $1 

else 
    echo "No file found" 
fi 
    
por 16.07.2014 / 16:40
0

Eu li a linha em um array bash:

if [[ -f $1 ]] ; then
    while read -ra line; do
        (( ${#line[@]} > 0 )) || continue  # skip empty lines
        name=${line[*]:0:2}
        age=${line[-1]}
        echo "$name ----- $age"
        if (( $age > 30 )); then
            echo "You get a discount"
        fi
    done < "$1"
else
    echo "No file found"
fi
#FirstName LastName ----- Age
Bruce Wayne ----- 31
You get a discount
Clark Kent ----- 32
You get a discount
Oliver Queen ----- 30

Isso também não é incomodado por $ age sendo um não inteiro:

$ age=Age
$ [ $age -gt 30 ] && echo old || echo young
bash: [: Age: integer expression expected
young
$ (( $age > 30 )) && echo old || echo young
young
$ [[ $age -gt 30 ]] && echo old || echo young
young
    
por 16.07.2014 / 18:29