複数の論理演算子((A || B)&&C)と「予期しないトークンの近くの構文エラー」

複数の論理演算子((A || B)&&C)と「予期しないトークンの近くの構文エラー」

私はBash 3を使用しており、条件を作成しようとしています。 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 || 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

ベストアンサー1

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 …

あなたは見つけることができます私のバッシュスタンド入門書効果がある

[通常のshで利用可能です。 bash(kshとzshを含む)にのみ適用されます[[((

1 複数のテストをブール演算子と組み合わせることも可能ですが、使いにくく、微妙な問題があるので説明しません。

おすすめ記事