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