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

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

Estou aprendendo o básico da programação 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 digitadas no Bash e que qualquer variável pode ser usada como um número inteiro se contiver apenas dígitos. Mas recebo o erro "expressão inteira esperada" quando executo isso... por quê?

Responder1

Na verdade, você pode definir alguns atributos em variáveis ​​​​usando o declare(ou o antigo typeset) builtin. declare -i var1 var2definirá o atributo inteiro nessas variáveis. Depois disso, atribuições que tentam definir valores não inteiros para essas variáveis ​​gerarão erros.

Mas o seu problema está na 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

As 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 um aviso, dentro de [.. ]sempre coloque aspas duplas em suas variáveis ​​para evitar que a expansão de palavras atrapalhe a sintaxe da sua expressão. (Quero dizer, você terá problemas com variáveis ​​não definidas, variáveis ​​contendo strings vazias e variáveis ​​contendo IFScaracteres.) Ou você pode usar o mais novo e melhor [[.. ]]em vez disso, que lida com esses casos corretamente:

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

Responder2

Você deve referenciar variáveis ​​​​anexando o nome com$

if [ $var1 -lt $var2 ] ; then...

informação relacionada