我正在编写一个非常简单的 bash 脚本,但我无法理解为什么已弃用的 $[] 可以完美地工作,而 $(()) 似乎破坏了整个事情。
我所指的代码是:
for i in {1..10};
do
printf %4d $[{1..10}*i]
echo
done
在此版本中,我没有遇到任何问题,但我不想使用已弃用的 bash 元素,这就是我想切换到 $(()) 的原因。
不幸的是,一旦我将代码更改为:
printf %4d $(({1..10}*i))
我收到一个错误:
./script_bash.sh: line 8: {1..10}*i: syntax error: argument expected (error token is "{1..10}*i")
我会很感激在这方面提供一些帮助......
将机器设置为 1990 年。
Bash 实现了$[]
语法符合 POSIX P1003.2d9(大约 1990 年),这是已发布的 P1003.2-1992 的草案。在草案和标准之间的两年里,POSIX 转而选择了 ksh88$(())
语法和行为。 Chet Ramey(bash 维护者)这样说,早在2012年:
Bash...实现了 $[...] 因为没有其他
当时的语法,并获得一些操作经验
shell 中的算术扩展。 Bash-1.14...列出了算术展开的两种形式,但是通过
bash-2.0发布的时候是1995年,手册中只提到了
$((...)) 形式。
这向我表明$[]
形式是实验性的,并且它具有某些行为(例如大括号扩展),当 POSIX 采用$(())
句法。这些实验行为被保留下来,因为已经有依赖它们的脚本(记住已经过去了两年多)。
切特在同一条线索中明确表示$[]
形式已过时,但并未弃用:
现在,继续使用 $[...] 语法几乎没有任何问题。
只需要几十个字节的代码。我没有删除它的计划。
The 当前 POSIX 标准,C.2.6 字扩展 > 算术扩展提到语法(强调我的):
在早期的提案中,使用了 $[表达式] 形式。它在功能上相当于当前文本的“$(())”,但有人提出反对意见,认为 1988 年的 KornShell 已经实现了“$(())”,并且没有令人信服的理由发明另一种语法。此外,“$[]”语法在涉及 case 语句中的模式时存在轻微的不兼容性。
因此,bash 中实现的行为并不完全符合规范,但由于没有计划删除它,如果它能巧妙地解决您的问题,我认为没有理由放弃它的好处。然而,正如 @Barmar 的评论所指出的,评论代码并将其链接到此处是一个好主意,这样未来的开发人员就知道你到底是什么意思!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)