web-dev-qa-db-ja.com

Bashのブール演算子(&&、-a、||、-o)

誰かが&&||-a、および-o Unix演算子の違いを説明できますか?

両方のタイプの使用に関する制限は何ですか?

条件でフラグを使用する場合、&&および||演算子を使用するだけですか?

次のように:

[ "$1" = "yes" ] && [ -r $2.txt ]

対:

[ "$1" = "yes" -a $2 -lt 3 ]
48
Victor Brunell

経験則:角括弧内で-aおよび-oを使用し、外側で&&および||を使用します。

Shell構文と[commandの構文の違いを理解することが重要です。

  • &&および||はシェル演算子です。これらは、2つのコマンドの結果を結合するために使用されます。これらはシェル構文であるため、特別な構文上の意味があり、コマンドの引数として使用できません。

  • [は特別な構文ではありません。実際には、[という名前のコマンドであり、testとも呼ばれます。 [は単なる通常のコマンドであるため、andおよびor演算子に-aおよび-oを使用します。 &&||を使用することはできません。これらは、コマンドが認識できないシェル構文であるためです。

ちょっと待って! Bashには、[[ ]]の形式のより洗練されたテスト構文があります。二重角括弧を使用すると、正規表現やワイルドカードなどにアクセスできます。また、&&||<>などのシェル演算子をブラケット内で自由に使用できます。これは、[とは異なり、二重ブラケット形式is特殊なシェル構文です。 Bashは[[自体を解析するため、[[ $foo == 5 && $bar == 6 ]]のようなものを書くことができます。

122
John Kugelman

-aおよび-oは、テストコマンドの古いおよび/または演算子です。 &&および||シェルのandおよび/または演算子です。最初のケースでは(古いシェルを想定)、

[ "$1" = 'yes' ] && [ -r $2.txt ]

シェルはand条件を評価しています。 2番目のケースでは、

[ "$1" = 'yes' -a $2 -lt 3 ]

テストコマンド(または組み込みテスト)はand条件を評価しています。

もちろん、すべてのモダンシェルまたはセミモダンシェルでは、テストコマンドはシェルに組み込まれているため、実際にはほとんど違いはありません。最新のシェルでは、ifステートメントを記述できます。

[[ $1 == yes && -r $2.txt ]]

これは、現代のプログラミング言語により類似しているため、読みやすくなっています。

15
Brad Lanam