最新版本的 ksh 废弃了-eq
在[[ ]]
块内使用,(( ))
而是更喜欢使用。为什么是这样?我找不到任何有关其优点的文档(( ))
,[[ ]]
而且我发现该语法更加明显。
例如:
#!/bin/ksh
var=1
if [[ $var -eq 1 ]]
then
echo ALPHA
fi
给出
[adam@hendrix test]$ ksh -n test.sh
test.sh: warning: line 3: -eq within [[...]] obsolete, use ((...))
答案1
如果你这样做
$ 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