ksh 过时的原因 -eq

me_*_*and 8 scripting ksh shell-script

最新版本的 ksh 已过时使用块-eq[[ ]](( ))而更喜欢使用。为什么是这样?我找不到任何关于(( ))over[[ ]]任何地方优势的文档,而且我发现这种语法更加明显。

例如:

#!/bin/ksh
var=1
if [[ $var -eq 1 ]]
then
  echo ALPHA
fi
Run Code Online (Sandbox Code Playgroud)

[adam@hendrix test]$ ksh -n test.sh
test.sh: warning: line 3: -eq within [[...]] obsolete, use ((...))
Run Code Online (Sandbox Code Playgroud)

Den*_*son 8

如果你这样做

$ ksh -n 'if [[ 1 -eq 1 ]]; then echo hi; fi'
Run Code Online (Sandbox Code Playgroud)

你收到消息

ksh: warning: line 1: -eq within [[...]] obsolete, use ((...))
Run Code Online (Sandbox Code Playgroud)

正如你所见。现在试试这个:

$ ksh -n 'if (( 1 -eq 1 )); then echo hi; fi'
ksh:  1 -eq 1 : arithmetic syntax error
Run Code Online (Sandbox Code Playgroud)

这有效:

$ ksh -n 'if (( 1 == 1 )); then echo hi; fi'
Run Code Online (Sandbox Code Playgroud)

请记住,第一条消息只是一个警告。您可以继续使用该表格。我怀疑它是否会被删除,因为它会破坏太多现有的脚本。顺便说一句,这是在没有警告的情况下接受的:

$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'
Run Code Online (Sandbox Code Playgroud)

其中一个主要原因在于双括号优选是比较操作符是比较熟悉的<<===等,(至少当与其它语言相比)。

双括号也适用于 Bash 和 zsh。一个相关的形式,算术替换,适用于所有这些,而且它是由 POSIX 指定的。

$ a=$((3 * 4))
Run Code Online (Sandbox Code Playgroud)

Korn、Bash 和 Z 也可以这样做:

$ (( a = 3 * 4 ))
Run Code Online (Sandbox Code Playgroud)

尽管 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
Run Code Online (Sandbox Code Playgroud)