kshが-eqを使用しなくなった理由

kshが-eqを使用しなくなった理由

最新バージョンの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 ))

POSIXシェルの例であるDashは正式な二重角括弧比較をサポートしていませんが、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

関連情報