bash: $[<算术表达式>] 与 $((<算术表达式>))
Posted
技术标签:
【中文标题】bash: $[<算术表达式>] 与 $((<算术表达式>))【英文标题】:bash: $[<arithmetic-expression>] vs. $((<arithmetic-expression>)) 【发布时间】:2011-01-25 19:43:20 【问题描述】:我刚刚偶然发现了 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 ]
但是,这只会计算EXPRESSION的结果,不做任何测试...
在我的 bash 手册页中,我只能找到 $(( EXPRESSION ))
形式,例如:
foo=42
bar=$((foo+1)) # evaluates an arithmetic expression
那么,$[...]
没有执行哪些测试,而$((...))
执行了哪些测试,或者$[...]
只是$((...))
的旧版本?
【问题讨论】:
历史观点见***.com/a/40048865/2908724。 【参考方案1】:bash v3.2.48 的手册页说:
[...] 算术展开的格式为:
$((expression))
旧格式 $[expression] 已弃用,并将在即将发布的版本中删除 bash。
所以$[...]
是不应再使用的旧语法。
【讨论】:
请注意,确切的文本不在the bash man page 中,而是在一些 bash 手册页中(例如Debian patch this)。该功能自 bash-2.0 以来已被弃用,但今天仍然存在 (bash-4.2)。【参考方案2】:@sth 完全正确。如果您对为什么现在支持更详细的语法感到好奇,请查看邮件列表中的这封旧电子邮件。
http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html
“在早期的提案中,使用了 $[expression] 形式。它在功能上 相当于当前文本的“$(())”,但反对意见是 提出 1988 年的 KornShell 已经实施了“$(())”并且 没有令人信服的理由来发明另一种语法。 此外,"$[]" 语法有一点不兼容,包括 case 语句中的模式。”
我不确定我是否喜欢“但有人已经更详细地完成了这件事”的理由,但你有它 - 也许案例陈述问题比我从这个晦涩的提及中想象的更引人注目?
【讨论】:
以上是关于bash: $[<算术表达式>] 与 $((<算术表达式>))的主要内容,如果未能解决你的问题,请参考以下文章