私はBash3を使用していますが、条件付きを形成します。 C / C ++では、非常に単純です:((A || B) && C)
。 Bashでは、そうではないことが判明しました(Gitの作成者は、他の取り組みに移る前にこのコードを提供したに違いないと思います)。
これは機能しません。 <0 or 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=<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ブラケットがあります。プライマーは便利です。
[
はプレーンなshで使用できます。 [[
と((
はbash(およびkshとzsh)に固有です。
¹複数のテストをブール演算子と組み合わせますが、これは使用が面倒で、微妙な落とし穴があるため、説明しません。
コメント
(Cのように)。
@Rolandいいえ、[[ … ]]
または$((…))
はグループ化のためだけのものです。
[[ … ]]
が追加されました((…))
がbash2.0に追加されました。||
と[
から[[
および((
に変更します。[
の優先順位と同じです(括弧を使用して評価の順序を制御します)が、& &は[[
と((
で