GNU/Linux >> Linux の 問題 >  >> Linux

複数の論理演算子、((a || B)&&C)、および「予期しないトークンの近くの構文エラー」?

私は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)に固有です。

¹ブール演算子を使用して複数のテストを組み合わせることもできますが、これは使用が面倒であり、微妙な落とし穴があるため、説明しません。


Linux
  1. Linux Cプログラミングチュートリアルパート11-算術演算子、リレーショナル演算子、および論理演算子

  2. 複数のパターンでGrepを実行する方法は?

  3. 共有ライブラリのロードとRAMの使用?

  1. Bash:予期しないトークン `}’の近くの構文エラー?

  2. 複数のホストにSSHで接続し、コマンドを実行しますか?

  3. .bashrcを編集した後の「予期しないトークンの近くの構文エラー」?

  1. Kali Linux での OpenVAS の構成と調整

  2. tar エラー:アーカイブに予期しない EOF があります

  3. Linux で複数のファイルを見つけて名前を変更する