kshが廃止された理由-eq


8

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 ((...))

回答:


8

もしあなたがそうするなら

$ 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シェルの例として、フォーム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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.