Answers:
如果你这样做
$ ksh -n 'if [[ 1 -eq 1 ]]; then echo hi; fi'
你得到消息
ksh: warning: line 1: -eq within [[...]] obsolete, use ((...))
如您所见。现在尝试这个:
$ ksh -n 'if (( 1 -eq 1 )); then echo hi; fi'
ksh: 1 -eq 1 : arithmetic syntax error
这有效:
$ ksh -n 'if (( 1 == 1 )); then echo hi; fi'
请记住,第一条消息仅是警告。您可以继续使用该表格。我怀疑它会被删除,因为它将破坏太多现有的脚本。顺便说一句,这被接受而没有警告:
$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'
其中一个主要原因在于双括号优选是比较操作符是比较熟悉的<
,<=
,==
等,(至少当与其它语言相比)。
双括号在Bash和zsh中也适用。一个相关的形式,算术替换,可以在所有这些形式中使用,并且由POSIX指定。
$ a=$((3 * 4))
Korn,Bash和Z也可以这样:
$ (( a = 3 * 4 ))
尽管Dash(作为POSIX Shell的示例)不支持形式中的双括号比较if (( ... ))
,您仍然可以使用算术替换来进行比较,但是结果与您期望的相反(对于其他)。
$ echo $(( 1 == 1 )); (( 1 == 1 )); echo $? # in Dash, use true instead of the second statement
1
0
$ echo $(( 1 == 2 )); (( 1 == 2 )); echo $? # in Dash, use false instead of the second statement
0
1