Bash: expressão inteira esperada, usando leitura / teste

7

Estou aprendendo os fundamentos da programação de shell, então escrevi algo simples como

#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
    echo "var1 is lt var2"
else
    echo "var2 is lt var1"
fi

Meu entendimento é que as variáveis não são tipificadas no Bash, e que qualquer variável pode ser usada como um inteiro se contiver apenas dígitos. Mas eu recebo o erro "expressão inteira esperada" quando eu corro isso ... por que?

    
por Gilles 13.07.2012 / 17:18

2 respostas

11

Na verdade, você pode definir alguns atributos em variáveis usando o declare (ou o antigo typeset ) embutido. declare -i var1 var2 definirá o atributo integer nessas variáveis. Após as atribuições que tentam definir valores não inteiros para essas variáveis, haverá um erro.

Mas o seu problema é com a sintaxe. Ao usar o valor de uma variável, você deve prefixar seu nome com $ :

if [ "$var1" -lt "$var2" ]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

Exceções são as avaliações aritméticas, onde não há necessidade de $ :

if ((var1<var2)); then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

Como uma palavra de advertência, dentro de [ .. ] sempre duplique as suas variáveis para evitar que a expansão das palavras atrapalhe a sintaxe da sua expressão. (Quero dizer, você terá problemas com variáveis não definidas, variáveis contendo cadeia vazia e variáveis contendo IFS caracteres.) Ou você pode usar o mais novo e melhor [[ .. ]] em vez disso, manipula corretamente tais casos:

if [[ $var1 -lt $var2 ]]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi
    
por 13.07.2012 / 17:26
1

Você deve referenciar as variáveis antes do nome com $

if [ $var1 -lt $var2 ] ; then...
    
por 13.07.2012 / 17:29