私はBash3を使用しており、条件付きを作成しようとしています。 C / C ++では、非常に単純です:((A || B)&&C)
。 Bashでは、そうではないことが判明しました(Gitの作成者は、他の取り組みに移る前にこのコードを提供したに違いないと思います)。
これは動作しません。 <0または1>
に注意してください 文字列リテラルではありません。これは0または1を意味します(通常は grep -i
から取得されます 。
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi
結果は次のようになります:
line 322: syntax error near unexpected token `[['
次に試しました:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi
結果は次のようになります:
line 322: syntax error near unexpected token `[['
問題の一部は、検索結果が些細な例であり、複合条件付きのより複雑な例ではないことです。
簡単な((A || B)&&C)
を実行するにはどうすればよいですか Bashで?
展開して、同じコマンドを複数のブロックで繰り返す準備ができました:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
...
fi
承認された回答:
bashの構文は、たとえその一部がCに触発されていても、Cに似ていません。単に、Cコードを書いて、それが機能することを期待することはできません。
シェルの主なポイントは、コマンドを実行することです。オープンブラケットコマンド[
は、単一のテストを実行するコマンドです¹。 test
と書くこともできます (最後の閉じ括弧なし)。 ||
および&&
演算子はシェル演算子であり、コマンドを組み合わせます 、テストではありません。
だからあなたが書くとき
[ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eq "0" ]
として解析されます
[ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eq "0" ]
これは
と同じですtest [ "$A" -eq "0" ||
test "$B" -ne "0" ] &&
test "$C" -eq "0"
不均衡なブラケットに気づきましたか?ええ、それは良くありません。かっこを使った試みにも同じ問題があります。偽の角かっこです。
コマンドをグループ化するための構文は中括弧です。中括弧を解析する方法では、中括弧の前に完全なコマンドが必要なので、中括弧内のコマンドを改行またはセミコロンで終了する必要があります。
if { [ "$A" -eq "0" ] || [ "$B" -ne "0" ]; } && [ "$C" -eq "0" ]; then …
二重角かっこを使用する別の方法があります。シングルブラケットとは異なり、ダブルブラケットは特別なシェル構文です。それらは条件式を区切ります。二重角かっこ内では、かっこや &&
などの演算子を使用できます および||
。二重括弧はシェル構文であるため、シェルは、これらの演算子が括弧内にある場合、通常のシェルコマンド構文の一部ではなく、条件式構文の一部であることを認識しています。
if [[ ($A -eq 0 || $B -ne 0) && $C -eq 0 ]]; then …
すべてのテストが数値である場合、人工表現を区切る別の方法があります。算術式は、非常にCに似た構文で整数計算を実行します。
if (((A == 0 || B != 0) && C == 0)); then …
私のbashブラケットプライマーが役立つかもしれません。
関連:Debian –システムクラッシュ– syslogの奇妙な文字?
[コード> プレーンshで使用できます。
[[コード> および
((
bash(およびkshとzsh)に固有です。
¹ブール演算子を使用して複数のテストを組み合わせることもできますが、これは使用が面倒であり、微妙な落とし穴があるため、説明しません。