удар:$[<arithmetic-expression>] против$((<arithmetic-expression>))
-
19-09-2019 - |
Вопрос
Я только что наткнулся на синтаксис bash:
foo=42
bar=$[foo+1] # evaluates an arithmetic expression
Когда я погуглил это, я нашел 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
Итак, какие тесты не выполняются с $[...]
что делать с $((...))
, или является $[...]
просто устаревшая версия $((...))
?
Решение
На странице руководства для bash v3.2.48 написано:
[...] Формат для арифметического расширения является:
$((expression))
В старый формат $[expression] устарел и будут удалены в следующих версиях из bash.
Итак $[...]
это старый синтаксис, который больше не следует использовать.
Другие советы
@sth абсолютно верен.И в случае, если вам интересно, почему сейчас в моде более подробный синтаксис, ознакомьтесь с этим старым письмом из списка рассылки.
http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html
“В ранних предложениях использовалась форма $[expression].Функционально это было эквивалентно "$(())" текущего текста, но были выдвинуты возражения по поводу того, что в KornShell 1988 года уже было реализовано "$(())" и не было никаких веских причин изобретать еще один синтаксис.Кроме того, синтаксис "$[]" имел незначительную несовместимость, связанную с шаблонами в операторах case.”
Я не уверен, что мне нравится обоснование “но кто-то уже сделал это более подробно”, но вот оно — может быть, проблема с изложением дела была более убедительной, чем я представляю из этого неясного упоминания?