Я изучаю основы программирования оболочки, поэтому я написал что-то простое, например:
#!/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...