只是出于好奇,是否有理由更喜欢以下内容:
while [[ $number -lt 10 ]]
超过
while (( $number < 10 ))
他们似乎在做同样的事情。我想知道其中一个是否有性能优势,或者可能存在一些可移植性问题[[ ]]
?
只是出于好奇,是否有理由更喜欢以下内容:
while [[ $number -lt 10 ]]
超过
while (( $number < 10 ))
他们似乎在做同样的事情。我想知道其中一个是否有性能优势,或者可能存在一些可移植性问题[[ ]]
?
两者都不是标准的,因此可移植性不是问题。如果您只是进行简单的比较,那么两者之间几乎没有区别
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 )) ]]
前段时间,当您想要进行任何类型的比较时,您正在使用程序“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 中了解有关 (( )) 和 [[ ]] 的更多信息是值得的。
((
并))
允许您使用所有复杂的算术运算符,但[[
只]]
允许在man test
我更喜欢使用((
and))
因为它也不会强制执行所有间距限制。你可以很好地使用:
while ((number<10))
或者
while ((number*2<10))
等等