当[[]]优先于(()时处理bash中的数字时

时间:2013-06-21 14:51:52

标签: bash

出于好奇,有理由喜欢这样的事情:

while [[ $number -lt 10 ]]

while (( $number < 10 )) 

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

3 个答案:

答案 0 :(得分:4)

两者都不是标准配置,因此便携性不是问题。如果你只进行简单的比较,那么

之间几乎没有区别
if [[ $number -lt 10 ]]

if (( number < 10 ))

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

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

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

VS

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

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

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

与不必要的复杂

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

答案 1 :(得分:3)

前段时间,当你想进行任何比较时,你使用的是程序“test”,通常用符号链接来命名为“[”。

所以你有这样的表达式:

if [ ..... ]; then
默认情况下,

测试与asciibetically进行比较,如果你想进行数值比较,你必须使用-lt / -gt和类似的。

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

所以你之前使用的语法相同:

if [ ... ]; then

可以改写为:

if [[ ... ]]; then

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

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

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

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

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

长话短说 - 对于比较,无关紧要很多。但是要在man bash中了解更多关于(())和[[]]的信息。

答案 2 :(得分:0)

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

中定义的受限比较

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

while ((number<10)) 

OR

while ((number*2<10))