出于好奇,有理由喜欢这样的事情:
while [[ $number -lt 10 ]]
在
while (( $number < 10 ))
他们似乎做同样的事情。我想知道是否有一个性能优势或其中一个或[[ ]]
的可移植性问题?
答案 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))
等