シェル(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
または-a
POSIXと-o
オプションを避ける1
if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
# ...
fi
1-a
ANDを避ける1つの理由-o
は最大の移植性です。すべてのtest
OR[
実装が4つ以上の引数を処理できるわけではありません。これは、正確に-a
ANDと連結式を使用した-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
。
より多くの関連コンテンツを閲覧できますここ