Откуда происходит рекурсивное расширение переменных в числовом контексте bash / shell?
В спецификации POSIX говорится оАрифметическое Расширение тот
[i] Если переменная оболочки x содержит значение, которое образует допустимую целочисленную константу, необязательно включая начальный знак плюс или минус, то арифметические расширения "$ ((x))" и "$ (($ x))" должны вернуть то же значение.
Что является разумным сокращением и довольно хорошо убирает сложные выражения.
Баш (версии3.2.25(1)-release
из CentOS 5 и4.3.33(1)-release
из нестабильного Debian), а также ksh (Version AJM 93t+ 2010-06-21
от CentOS 5) все, кажется, идет на шаг дальше, чем это, однако.
Кажется, что все они рекурсивно раскрывают переменные, встречающиеся в арифметическом раскрытии (и числовые контексты в[[
в результате использования числовых операторов).
В частности:
$ set -x
$ bar=5
+ bar=5
$ foo=bar
+ foo=bar
$ [ foo -gt 4 ]; echo $?
+ '[' foo -gt 4 ']'
-bash: [: foo: integer expression expected
+ echo 2
2
$ [[ foo -gt 4 ]]; echo $?
+ [[ foo -gt 4 ]]
+ echo 0
0
$ [[ foo -eq 0 ]]; echo $?
+ [[ foo -eq 0 ]]
+ echo 1
1
$ [[ foo -eq 5 ]]; echo $?
+ [[ foo -eq 5 ]]
+ echo 0
0
$ (( foo == bar )); echo $?
+ (( foo == bar ))
+ echo 0
0
$ (( foo == 1 )); echo $?
+ (( foo == 1 ))
+ echo 1
1
Откуда такое поведение и почему оно было бы желательным?
Это делает использование[[
на месте[
эксплицитноМеньше безопасен при использовании с числовыми операторами, потому что недопустимые значения и типографские ошибки превращаются из ошибок скрипта в бесшумные (но, вероятно, ошибочные) тесты.
Редактировать: В качестве дополнительного вопроса, если кто-то знает,когда эта "особенность" была добавлена в bash / etc. Мне было бы интересно это знать.