![Bash: expressão inteira esperada, usando leitura/teste](https://rvso.com/image/23940/Bash%3A%20express%C3%A3o%20inteira%20esperada%2C%20usando%20leitura%2Fteste.png)
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 var2
definirá 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 IFS
caracteres.) 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...