論理演算子の優先順位が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を使用します および-atestへの引数としての演算子 または[コマンド。このような場合、AND(&&または-a)はOR(||よりも優先されます または-o)。この点を明確にしてくれたStephaneChazelasのコメントに感謝します。 -
CおよびCのような言語では
&&||よりも優先順位が高い これが、元の構成が次のように動作することを期待した理由ですtrue || (echo aaa && echo bbb).ただし、これはBashの場合には当てはまりません。ただし、両方の演算子の優先順位が同じであるため、Bashは左結合規則を使用して式を解析します。これを提起してくれたKevinのコメントに感謝します。
-
3つすべての場合もあります 式が評価されます。最初のコマンドがゼロ以外の終了ステータスを返す場合、
||短絡せず、2番目のコマンドを実行します。 2番目のコマンドがゼロ終了ステータスで戻った場合、&&同様に短絡せず、3番目のコマンドが実行されます。これを提起してくれたIgnacioVazquez-Abramsのコメントに感謝します。