Bash: $[<арифметическое выражение>] против $((<арифметическое выражение>))
Я только что наткнулся на синтаксис bash:
foo=42
bar=$[foo+1] # evaluates an arithmetic expression
Когда я зашел в Google, я нашел http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_05:
3.4.6. Арифметическое расширение
Арифметическое расширение позволяет оценивать арифметическое выражение и замену результата. Формат арифметического расширения:
$(( EXPRESSION ))
...
По возможности пользователи bash должны пытаться использовать синтаксис с квадратными скобками:
$[ EXPRESSION ]
Однако это будет только вычислять результат EXPRESSION и не выполнять никаких тестов...
На моей странице bash я могу найти только форму $(( EXPRESSION ))
, например:
foo=42
bar=$((foo+1)) # evaluates an arithmetic expression
Итак, какие тесты не выполняются с помощью $[...]
, которые работают с $((...))
, или это $[...]
только устаревшая версия $((...))
?
Ответы
Ответ 1
В manpage для bash v3.2.48 говорится:
[...] Формат арифметического расширения:
$((expression))
старый формат $[выражение] устарел и будет удален в следующих версиях из bash.
Итак, $[...]
- это старый синтаксис, который больше не должен использоваться.
Ответ 2
@sth полностью корректен. И в случае, если вам интересно, почему более подробный синтаксис теперь в порядке, ознакомьтесь с этим старым письмом из списка рассылки.
http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html
"В ранних предложениях использовалась форма $[выражение]. Она была функционально
эквивалентно "$ (())" текущего текста, но возражения были
заявила, что в 1988 году KornShell уже реализовал "$ (())" и
не было убедительной причины придумать еще один синтаксис.
Кроме того, синтаксис "$ []" имел незначительную несовместимость с участием
шаблоны в утверждениях case. "
Я не уверен, что мне нравится логическое обоснование, "но кто-то уже сделал это более подробно", но там у вас есть, может быть, проблема case-statement была более убедительной, чем я представляю себе из этого неясного упоминания?