回答:
[[ ]]BourneにもPOSIXにもないことに注意してくださいsh。真のsh構文の場合、これを行うにはいくつかの方法があります。
1 [ ]ペアのみを使用する
if [ 1 -eq "$a" -a \( 1 -eq "$b" -o 2 -eq "$b" \) ]; then
# ...
fi
またはPOSIX -aと-oオプションを回避する1
if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
# ...
fi
1つの避けるための一つの理由-aと-o最大の移植である-すべてではないtestか、[実装はあなたが式を連鎖さ何を得る正確である、4つの以上の引数を扱うことができる-aと-oして\( \)。
/bin/sh、にない機能を使用してスクリプトを記述することは正しくありませんsh。これkshはではshなく、のスーパーセットであることに注意してくださいsh。あなたが取る場合ksh-ブト宣言-れたままshどこのシステムにスクリプトをshへのシンボリックリンクではないksh、それが壊れることがあります。スクリプトが宣言と一致することを確認することで、この問題を回避できます。
/bin/shを呼び出し/bin/shます。問題は/bin/sh受け入れません[[。あなたはあなたのシバンとして、例えば、[[受け入れないシェルを使用することも使用することもできません。[[ksh
-a/ -oが一部の実装でサポートされていないことではなく、任意の引数に対して信頼できないことです。同様の[ "$a" = "$b" -o "$b" = "$c" ]値のために失敗する$aなどの!多くと[実装。
私はいくつかの構文を試してみましたが、
if [[ $a -eq 1 ]] && [[ $b -eq 1 || $b -eq 2 ]]; then
...
fi
取り組んでいます。
別のPOSIXアプローチ:
if [ "$((a == 1 && ( b == 1 || b == 2 )))" -ne 0 ]; then
...
fi
単なるでそれを行う正しい方法shell:
if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then
...
fi
説明:
testここでは、括弧と-o論理ORとして機能します。論理と「かっこ」内部ます場合は、使用します-a。
詳しくはこちらをご覧ください
ksh?次に、あなたの最初のコードでは、括弧の唯一の1以上のペアが必要になります。if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi