Тест - лейтенант Command в, если оператор со строковой переменной

Я изучал, Если операторы в ударе, и раскрыли некоторое неожиданное поведение.

Скажем, то, что у меня есть переменная b=2. Это - очевидно, строка. Если я делаю если оператор как это:

if [ $((b)) -lt 5 ]
then
...
fi

Это успешно передает условный оператор, поскольку действительно 2 меньше чем 5. Однако, если я удаляю двойные скобки (if [ b -lt 5 ]), это все еще работает тот же путь примером прежде. Можно ли сказать мне, почему это так? Я думал это -lt работы только с целыми числами, не со строками. Разве это неявно преобразовывает строковую переменную в целый тип здесь?

0
задан 18 October 2019 в 22:16

1 ответ

Переменные 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

успешно выполняется.

2
ответ дан 22 December 2019 в 00:18

Другие вопросы по тегам:

Похожие вопросы: