在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 )) ]]