bash: $ [‹arithmetic-expression›] vs. $ ((‹arithmetic-expression›))

Я только что наткнулся на синтаксис 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 ] 

Однако при этом будет рассчитан только результат ВЫРАЖЕНИЯ, а не тесты ...

На моей странице руководства bash я могу найти только $(( EXPRESSION )) форму, например:

foo=42
bar=$((foo+1)) # evaluates an arithmetic expression

Итак, какие тесты не выполняются с $[...], которые выполняются с $((...)), или $[...] - это просто устаревшая версия $((...))?


person Chen Levy    schedule 10.03.2010    source источник
comment
Историческую перспективу см. stackoverflow.com/a/40048865/2908724.   -  person bishop    schedule 14.10.2016


Ответы (2)


На странице руководства для bash v3.2.48 говорится:

[...] Формат арифметического раскрытия:

     $((expression))

Старый формат $ [выражение] устарел и будет удален в следующих версиях bash.

Итак, $[...] - это старый синтаксис, который больше не следует использовать.

person sth    schedule 10.03.2010
comment
Обратите внимание, что точного текста нет на странице руководства bash. , он находится на некоторых страницах руководства bash (например, Debian исправляет это). Эта функция устарела с bash-2.0, но сохраняется и сегодня (bash-4.2). - person mr.spuratic; 17.04.2014

@sth совершенно правильно. А если вам интересно, почему сейчас предпочтение отдается более подробному синтаксису, посмотрите это старое письмо из списка рассылки.

http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html

«В ранних предложениях использовалась форма $ [выражение]. Функционально он был эквивалентен «$ (())» текущего текста, но были высказаны возражения, что KornShell 1988 года уже реализовал «$ (())» и не было веских причин для изобретения еще одного синтаксиса. Кроме того, синтаксис «$ []» имел небольшую несовместимость с шаблонами в операторах case ».

Я не уверен, что мне нравится логика «но кто-то уже сделал это более подробно», но вот оно - может быть, проблема case-statement была более убедительной, чем я могу себе представить из этого неясного упоминания?

person Brandon Rhodes    schedule 11.08.2012