4

只是出于好奇,是否有理由更喜欢以下内容:

while [[ $number -lt 10 ]]

超过

while (( $number < 10 )) 

他们似乎在做同样的事情。我想知道其中一个是否有性能优势,或者可能存在一些可移植性问题[[ ]]

4

3 回答 3

4

两者都不是标准的,因此可移植性不是问题。如果您只是进行简单的比较,那么两者之间几乎没有区别

if [[ $number -lt 10 ]]

if (( number < 10 ))

除了从第二个中删除的能力$(因为所有字符串都被假定为变量并取消引用)和可读性。

[[...]]当您的条件结合算术和非算术测试时,您可能更喜欢:

if [[ $number -lt 10 && $file = *.txt ]]

对比

if (( number < 10 )) && [[ $file = *.txt ]]

(( ... ))如果您的比较涉及一些计算,您可能会更喜欢:

if (( number*2 < 10-delta ))

vs 不必要的复杂

if [[ $(( number*2 )) -lt $(( 10-delta )) ]]
于 2013-06-21T15:16:01.740 回答
3

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

所以你有这样的表达:

if [ ..... ]; then

test 默认比较 asciibetically,如果你想要数值比较,你必须使用 -lt/-gt 和类似的。

然后,bash 有了自己的内部测试引擎。要使用它,请使用 [[.

因此,您之前使用的语法相同:

if [ ... ]; then

可以改写为:

if [[ ... ]]; then

并做同样的事情,除了比较是在 bash 本身中完成的,并且不需要测试程序的 fork/exec 。

由于现在它不调用外部程序,因此添加另一种数字比较方式会更简单。于是 (( )) 出现了。

它有一定的好处,但通常被忽视的是它强加了数字上下文

这意味着您可以拥有以下内容:

i=1
(( i++ ))
echo $i # will return 2

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

于 2013-06-21T14:58:20.143 回答
0

(())允许您使用所有复杂的算术运算符,但[[]]允许在man test

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

while ((number<10)) 

或者

while ((number*2<10)) 

等等

于 2013-06-21T14:54:51.157 回答