シェルの複雑な条件の構文は何ですか?


10

シェル(sh)で次のテストを表現したい場合:

if ( a == 1 && ( b == 1 || b == 2 )) { ... }

これまでのところ、私が書くことができた最高のものはこれです:

if [[ $a -eq 1 ]]; then
  if [[ $b -eq 1 || $b -eq 2 ]]; then
     ...
  fi
fi

&&と||を合成する方法がわかりません 正しい優先順位で。グーグルで私に答えは得られませんでした(チュートリアルには、もしあれば、基本的な例のみが示されています)

これら二つを組み合わせるための構文は何であるならば 1には?


1
使用しない理由はksh?次に、あなたの最初のコードでは、括弧の唯一の1以上のペアが必要になります。if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
manatwork

回答:


14

[[ ]]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 shebang 。デフォルトのシェルはkshです。なぜ使用されないのですか?
Offirmo 2012年

2
@Offirmoスクリプトをとして宣言した場合/bin/sh、にない機能を使用してスクリプトを記述することは正しくありませんsh。これkshはではshなく、のスーパーセットであることに注意してくださいsh。あなたが取る場合ksh-ブト宣言-れたままshどこのシステムにスクリプトをshへのシンボリックリンクではないksh、それが壊れることがあります。スクリプトが宣言と一致することを確認することで、この問題を回避できます。
jw013 2012年

/ bin / shをshebangとして設定すると、スクリプトが/ bin / shを介して呼び出されると考えました。デフォルトのシェル(ksh)がシバンを無視して直接解釈するということですか?
Offirmo、2012年

@Offirmoあなたは正しい:のシバンは/bin/shを呼び出し/bin/shます。問題は/bin/sh受け入れません[[。あなたはあなたのシバンとして、例えば、[[受け入れないシェルを使用することも使用することもできません。[[ksh
jw013 2012年

2
問題は、-a/ -oが一部の実装でサポートされていないことではなく、任意の引数に対して信頼できないことです。同様の[ "$a" = "$b" -o "$b" = "$c" ]値のために失敗する$aなどの!多くと[実装。
ステファンChazelas

2

私はいくつかの構文を試してみましたが、

if [[ $a -eq 1 ]] && [[ $b -eq 1 || $b -eq 2 ]]; then
 ...
fi

取り組んでいます。


1
これは、4以上のbashバージョンで機能します
Nikhil Mulley、2012年


0

単なるでそれを行う正しい方法shell

if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then 
    ...
fi

説明:

testここでは、括弧と-o論理ORとして機能します。論理と「かっこ」内部ます場合は、使用します-a

詳しくはこちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.