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

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

シェル(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ときに得られるものと同じです\( \)

おすすめ記事