Bash: ожидается целочисленное выражение, используется чтение/тест

Bash: ожидается целочисленное выражение, используется чтение/тест

Я изучаю основы программирования оболочки, поэтому я написал что-то простое, например:

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

Насколько я понимаю, переменные в Bash не типизированы, и любая переменная может использоваться как целое число, если она содержит только цифры. Но я получаю ошибку "ожидается целочисленное выражение", когда запускаю это... почему?

решение1

На самом деле вы можете задать некоторые атрибуты переменных, используя встроенную функцию declare(или старую typeset). declare -i var1 var2установит целочисленный атрибут для этих переменных. После этого назначения, которые пытаются задать нецелочисленные значения для этих переменных, вызовут ошибку.

Но у вас проблема с синтаксисом. При использовании значения переменной вы должны добавлять к ее имени префикс $:

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

Исключением являются арифметические оценки, где нет необходимости в $:

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

В качестве предупреждения, внутри [.. ]всегда заключайте переменные в двойные кавычки, чтобы избежать искажения синтаксиса выражения при расширении слов. (Я имею в виду, что у вас будут проблемы с неустановленными переменными, переменными, содержащими пустую строку, и переменными, содержащими IFSсимволы.) Или вы можете использовать более новый и лучший [[.. ]]вместо этого, который правильно обрабатывает такие случаи:

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

решение2

Вы должны ссылаться на переменные, добавляя к имени префикс$

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

Связанный контент