論理演算子の優先順位が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のコメントに感謝します。