bash:$ [<arithmetic-expression>]与$((<arithmetic-expression>))

Che*_*evy 29 legacy syntax bash arithmetic-expressions operators

我刚刚偶然发现了bash语法:

foo=42
bar=$[foo+1] # evaluates an arithmetic expression
Run Code Online (Sandbox Code Playgroud)

当我用Google搜索时,我找到了 http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_05:

3.4.6.算术扩展

算术扩展允许评估算术表达式和结果的替换.算术扩展的格式是:

$(( EXPRESSION )) 
Run Code Online (Sandbox Code Playgroud)

...

只要有可能,Bash用户应尝试使用方括号的语法:

$[ EXPRESSION ] 
Run Code Online (Sandbox Code Playgroud)

但是,这只会计算EXPRESSION的结果,并且不进行测试......

在我的bash手册页中,我只能找到如下$(( EXPRESSION ))形式:

foo=42
bar=$((foo+1)) # evaluates an arithmetic expression
Run Code Online (Sandbox Code Playgroud)

那么什么测试不是用$[...]那个做的$((...)),或者$[...]只是遗留版本$((...))

sth*_*sth 34

bash v3.2.48的联机帮助页说:

[...]算术扩展的格式是:

     $((expression))
Run Code Online (Sandbox Code Playgroud)

老格式$ [表达]已被弃用,并且将在bash的即将到来的版本中删除.

所以$[...]是旧语法,不应该再使用.

  • 请注意,确切的文本不在[*the*bash手册页](http://tiswww.case.edu/php/chet/bash/bash.html)中,它位于*some*bash手册页中(例如[Debian patch]这个](http://patch-tracker.debian.org/patch/series/view/bash/4.1-3/man-arithmetic.dpatch)).该功能自bash-2.0以来已被弃用,但今天仍然存在(bash-4.2). (7认同)

Bra*_*des 13

@sth是完全正确的.如果您对为什么现在支持更详细的语法感到好奇,请查看邮件列表中的旧电子邮件.

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

"在早期提案中,使用了表格$ [表达式].它在功能上等同于当前文本的"$(())",但提出异议,即1988年KornShell已经实现了"$(())"并且没有令人信服的理由发明另一种语法.此外,"$ []"语法与case语句中的模式有轻微的不兼容性."

我不确定我是否喜欢这个理由"但是有人已经更加冗长地完成了这一点",但是你有它 - 也许案例陈述问题比我想象的更加引人注目?