在bash中处理数字时,[[]]比(())更受欢迎

在bash中处理数字时,[[]]比(())更受欢迎,bash,Bash,出于好奇,有没有理由喜欢这样的东西: while [[ $number -lt 10 ]] i=1 (( i++ )) echo $i # will return 2 结束 while($number

出于好奇,有没有理由喜欢这样的东西:

while [[ $number -lt 10 ]]
i=1
(( i++ ))
echo $i # will return 2
结束

while($number<10))
他们似乎做了同样的事情。我想知道它们中的一个是否有性能优势,或者
[[]]
是否有一些可移植性问题

((
允许您使用所有复杂的算术运算符,但
[[
]
仅允许
人工测试中定义的受限比较

我更喜欢使用
,因为它也不会强制执行所有间距限制。您可以很好地使用:

while ((number<10)) 

while((number前一段时间,当您想要进行任何类型的比较时,您正在使用程序“test”,该程序通常与名称“[”进行符号链接

所以你有这样的表达:

if [ ..... ]; then
默认情况下,test会进行算术比较,如果需要进行数值比较,则必须使用-lt/-gt和类似的方法

然后,bash有了自己的内部测试引擎

因此,与前面的语法相同:

if [ ... ]; then
可以改写为:

if [[ ... ]]; then
除了比较是在bash本身中完成的,并且不需要测试程序的fork/exec之外,也可以执行相同的操作

由于现在它不需要调用外部程序,所以添加另一种比较数字的方法就更简单了。因此(())出现了

它有一定的好处,但一个经常被忽视的是,它强加了数字背景

也就是说,你可以做如下事情:

while [[ $number -lt 10 ]]
i=1
(( i++ ))
echo $i # will return 2

长话短说-对于比较来说,这并不重要。但是了解更多关于man bash中(())和[[])的信息是值得的。

两者都不是标准的,所以可移植性不是问题。如果您只是执行简单的比较,那么两者之间的差别很小

if [[ $number -lt 10 ]]

vs

vs不必要的复杂

if [[ $(( number*2 )) -lt $(( 10-delta )) ]]

[]与test不同。@depsz:同意,但它允许的运算符是test使用的运算符。是的,但[[]不限于测试功能。它可以做得更多。@depsz:是的,它可以,但与
((和))
相比,它受到了严重的限制。从同样的意义上说,
(())
受到了“严重的限制”要确定文件是目录还是符号链接:
(())
[[]]]
有不同的用途,只是有一小部分重叠。简短回答:当它可用时,
(())
总是比
[[]]
更受欢迎……但很多人根本不知道它的存在。
if [[ $number -lt 10 && $file = *.txt ]]
if (( number < 10 )) && [[ $file = *.txt ]]
if (( number*2 < 10-delta ))
if [[ $(( number*2 )) -lt $(( 10-delta )) ]]