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

シェル論理演算子の優先順位&&、||?

論理演算子の優先順位がbashでどのように機能するかを理解しようとしています。たとえば、次のコマンドは何もエコーしないと予想していました。

true || echo aaa && echo bbb

しかし、私の予想に反して、bbb 印刷されます。

誰かが説明してもらえますか、複合&&をどのように理解できますか および|| bashの演算子?

承認された回答:

多くのコンピューター言語では、同じ優先順位を持つ演算子は左連想です。つまり、グループ化構造がない場合、左端の操作が最初に実行されます。 Bashもこのルールの例外ではありません。

Bashでは&&であるため、これは重要です。 および|| 同じ優先順位があります。

したがって、この例で発生するのは、左端の操作(|| )最初に実行されます:

true || echo aaa

true以降 明らかに真実です、|| 演算子が短絡し、echo aaaを評価する必要なしにステートメント全体が真であると見なされます あなたが期待するように。現在、右端の操作を実行する必要があります:

(...) && echo bbb

最初の操作がtrueと評価された(つまり、終了ステータスが0であった)ため、実行しているように見えます

true && echo bbb

したがって、&& 短絡しません。そのため、bbbが表示されます。 エコーしました。

でも同じ動作が得られます
false && echo aaa || echo bbb

コメントに基づくメモ

  • 左結合法則はのみであることに注意してください。 両方の演算子が同じの場合に続きます 優先順位。これは、これらの演算子を[[...]]などのキーワードと組み合わせて使用​​する場合には当てはまりません。 または((...)) または-oを使用します および-a testへの引数としての演算子 または[ コマンド。このような場合、AND(&& または-a )はOR(||よりも優先されます または-o )。この点を明確にしてくれたStephaneChazelasのコメントに感謝します。
  • CおよびCのような言語では&& ||よりも優先順位が高い これが、元の構成が次のように動作することを期待した理由です

    true || (echo aaa && echo bbb). 
    

    ただし、これはBashの場合には当てはまりません。ただし、両方の演算子の優先順位が同じであるため、Bashは左結合規則を使用して式を解析します。これを提起してくれたKevinのコメントに感謝します。

  • 3つすべての場合もあります 式が評価されます。最初のコマンドがゼロ以外の終了ステータスを返す場合、|| 短絡せず、2番目のコマンドを実行します。 2番目のコマンドがゼロ終了ステータスで戻った場合、&& 同様に短絡せず、3番目のコマンドが実行されます。これを提起してくれたIgnacioVazquez-Abramsのコメントに感謝します。

関連:シェルを介してアプリに証明書の権限を付与しますか?
Linux
  1. `cd`外部コマンドのポイント?

  2. シェルスクリプトがメールコマンドでハングアップしますか?

  3. $の意味は?シェルスクリプトでは?

  1. Linux でデフォルトのシェルを変更する方法

  2. Unix シェルで数値の列を合計する

  3. スクリプト内の bash シェル スクリプトおよび関数の変数スコープ

  1. Bashシェルのカスタマイズ

  2. バッシュシェルが算術オーバーフローなどを警告しない理由は?

  3. Bashでの$#の使用は何ですか