Bash: se espera una expresión entera, usando lectura/prueba

Bash: se espera una expresión entera, usando lectura/prueba

Estoy aprendiendo los conceptos básicos de la programación de shell, así que escribí algo simple como

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

Tengo entendido que las variables no están tipificadas en Bash y que cualquier variable puede usarse como un número entero si solo contiene dígitos. Pero aparece el error "se espera expresión entera" cuando ejecuto esto... ¿por qué?

Respuesta1

En realidad, puede establecer algunos atributos en las variables utilizando el declare(o el antiguo typeset) incorporado. declare -i var1 var2establecerá el atributo de número entero en esas variables. Después de eso, las asignaciones que intenten establecer valores no enteros para esas variables generarán un error.

Pero tu problema es con la sintaxis. Cuando utilice el valor de una variable, debe anteponer su nombre con $:

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

Las excepciones son las evaluaciones aritméticas, donde no es necesario $:

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

Como advertencia, dentro [... ]siempre comillas dos veces tus variables para evitar que la expansión de palabras arruine la sintaxis de tu expresión. (Quiero decir, tendrá problemas con variables no configuradas, variables que contienen cadenas vacías y variables que contienen IFScaracteres). O puede usar el más nuevo y mejor [[... ]]que maneja estos casos correctamente:

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

Respuesta2

Debe hacer referencia a las variables anteponiendo el nombre con$

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

información relacionada