シェル論理演算子&&および||の優先順位

シェル論理演算子&&および||の優先順位

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

true || echo aaa && echo bbb

ところが私の期待とは違ってbbb印刷された。

誰かがbashで複合演算子&&と演算子を理解する方法を説明できますか?||

ベストアンサー1

多くのコンピュータ言語で同じ優先順位を持つ演算子は次のとおりです。左派労組。すなわち、グループ化構造がない場合には、一番左の演算を先に行う。すごい例外なくこのルールに。

Bashと他のシェルでは優先順位が同じで&&あるため、これが重要です。||これは一般的&&||

したがって、あなたの例では、||一番左の操作()が最初に行われます。

true || echo aaa

true明らかに正確であるため、||演算子は短絡され、期待echo aaaどおりに評価する必要なしに文全体が正しいと見なされます。これで一番右にある作業だけが残りました。

(...) && echo bbb

最初のタスクはtrue(つまり、終了ステータスが0)と評価されるため、次のタスクを実行するのと同じです。

true && echo bbb

したがって、&&短絡が発生しないため、bbbエコーが表示されます。

あなたは同じ行動をします

false && echo aaa || echo bbb

コメントに基づいてコメントを付ける

  • 左の関連ルールは次のとおりです。ただ両方のオペレータ同じ優先事項[[...]]orなどのキーワードでこれらの演算子を使用する場合、またはorコマンドの引数としてand演算子を((...))使用する場合は、そうではありません。この場合、ANDはORよりも優先されます。これを明確に説明してくれたStephane Chazelasに感謝します。-o-atest[&&-a||-o

  • そうだCからCに似た言語は、これより&&優先順位が高い||ため、おそらく元の構成が次のように動作すると予想しています。

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

ただし、両方の演算子の優先順位が同じBashの場合はそうではありません。これがBashが式を解析するために左の関連ルールを使用する理由です。この点を提起したケビンのコメントありがとうございます。

  • このような状況もあるかもしれません。全3式が評価されます。最初のコマンドがゼロ以外の終了状態を返す場合、ショートせずに||2番目のコマンドで実行が続行されます。 2 番目のコマンドが 0 終了状態に戻った場合、段落も発生せず、3 番目の&&コマンドが実行されます。この点を提起したIgnacio Vazquez-Abramsのコメントありがとうございます。

おすすめ記事