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

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

シェル(sh)で次のテストを表現するには:

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

これまで私が書くことができる最も良いことは次のとおりです。

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

&&と||を正しい優先順位に組み合わせる方法がわかりません。インターネット検索では何も答えられませんでした(チュートリアルでは基本的な例のみを提供します)。

これら2つを組み合わせる構文は何ですかもし一つになりますか?

答え1

[[ ]]BourneまたはPOSIXにはありませんsh。実際のsh構文では、これを行う方法はいくつかあります。

ペアのみ[ ]を使用してください

if [ 1 -eq "$a" -a \( 1 -eq "$b" -o 2 -eq "$b" \) ]; then
    # ...
fi

または-aPOSIXと-oオプションを避ける1

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

1-a ANDを避ける1つの理由-oは最大の移植性です。すべてのtestOR[実装が4つ以上の引数を処理できるわけではありません。これは、正確に-aANDと連結式を使用した-oときに得られるものと同じです\( \)

答え2

私はいくつかの構文を試して発見しました。

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

職場で。

答え3

別のPOSIXアプローチ:

if [ "$((a == 1 && ( b == 1 || b == 2 )))" -ne 0 ]; then
  ...
fi

答え4

正しい方法は次のとおりですshell

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

説明する:

testここでは括弧と-o論理ORとして機能します。論理があり、「かっこ」内にある場合-a

より多くの関連コンテンツを閲覧できますここ

関連情報