Я изучал, Если операторы в ударе, и раскрыли некоторое неожиданное поведение.
Скажем, то, что у меня есть переменная b=2
. Это - очевидно, строка. Если я делаю если оператор как это:
if [ $((b)) -lt 5 ]
then
...
fi
Это успешно передает условный оператор, поскольку действительно 2 меньше чем 5. Однако, если я удаляю двойные скобки (if [ b -lt 5 ]
), это все еще работает тот же путь примером прежде. Можно ли сказать мне, почему это так? Я думал это -lt
работы только с целыми числами, не со строками. Разве это неявно преобразовывает строковую переменную в целый тип здесь?
Переменные Bash по существу untyped1 - тесты, которые только имеют смысл для конкретного типа, может перестать работать во время оценки, если значение не может быть преобразовано успешно. Допустимые формы арифметического теста:
$ b=4; if [ $b -lt 5 ]; then echo "less"; fi
less
или (использующий синтаксис арифметического выражения)
$ b=4; if (( $b < 5 )); then echo "less"; fi
less
Как отмечено в ARITHMETIC EVALUATION
разделman bash
, разыменование $
может быть опущен в (( ... ))
контекст:
Переменные Shell позволяются как операнды; расширение параметра выполняется, прежде чем выражение оценено. В рамках выражения на переменные оболочки можно также сослаться по имени, не используя синтаксис расширения параметра.
Так
$ b=4; if (( b < 5 )); then echo "less"; fi
less
То же не верно в POSIX [ ]
тестовый синтаксис, который будет рассматривать b
как строковый литерал:
$ b=4; if [ b -lt 5 ]; then echo "less"; fi
-bash: [: b: integer expression expected
При попытке выполнить a [ ]
арифметический тест на переменной, которая содержит нечисловое значение, которое он приведет к сбою по той же причине т.е. что значение не может быть преобразовано в числовой тип:
$ b=foo; if [ $b -lt 5 ]; then echo "less"; fi
-bash: [: foo: integer expression expected
1 Элементарная проверка типа может быть реализована с помощью declare -i
если -u
опция оболочки установлена напр.
$ set -u
$ declare -i b
$ b=foo
bash: foo: unbound variable
$ echo $?
1
тогда как присвоение допустимого числового значения
$ b=4
$ echo $?
0
успешно выполняется.