誰かが&&
、||
、-a
、および-o
Unix演算子の違いを説明できますか?
両方のタイプの使用に関する制限は何ですか?
条件でフラグを使用する場合、&&
および||
演算子を使用するだけですか?
次のように:
[ "$1" = "yes" ] && [ -r $2.txt ]
対:
[ "$1" = "yes" -a $2 -lt 3 ]
経験則:角括弧内で-a
および-o
を使用し、外側で&&
および||
を使用します。
Shell構文と[
commandの構文の違いを理解することが重要です。
&&
および||
はシェル演算子です。これらは、2つのコマンドの結果を結合するために使用されます。これらはシェル構文であるため、特別な構文上の意味があり、コマンドの引数として使用できません。
[
は特別な構文ではありません。実際には、[
という名前のコマンドであり、test
とも呼ばれます。 [
は単なる通常のコマンドであるため、andおよびor演算子に-a
および-o
を使用します。 &&
と||
を使用することはできません。これらは、コマンドが認識できないシェル構文であるためです。
ちょっと待って! Bashには、[[ ]]
の形式のより洗練されたテスト構文があります。二重角括弧を使用すると、正規表現やワイルドカードなどにアクセスできます。また、&&
、||
、<
、>
などのシェル演算子をブラケット内で自由に使用できます。これは、[
とは異なり、二重ブラケット形式is特殊なシェル構文です。 Bashは[[
自体を解析するため、[[ $foo == 5 && $bar == 6 ]]
のようなものを書くことができます。
-aおよび-oは、テストコマンドの古いおよび/または演算子です。 &&および||シェルのandおよび/または演算子です。最初のケースでは(古いシェルを想定)、
[ "$1" = 'yes' ] && [ -r $2.txt ]
シェルはand条件を評価しています。 2番目のケースでは、
[ "$1" = 'yes' -a $2 -lt 3 ]
テストコマンド(または組み込みテスト)はand条件を評価しています。
もちろん、すべてのモダンシェルまたはセミモダンシェルでは、テストコマンドはシェルに組み込まれているため、実際にはほとんど違いはありません。最新のシェルでは、ifステートメントを記述できます。
[[ $1 == yes && -r $2.txt ]]
これは、現代のプログラミング言語により類似しているため、読みやすくなっています。