Bash 演算子[[ vs [ vs ( vs((?

Bash 演算子[[ vs [ vs ( vs((?

bash(括弧、二重括弧、角括弧、および二重括弧)で使用すると、これらの演算子がどのように異なるかが少し混乱します。

[[ , [ , ( , ((

私は人々が次の文でその表現を使用しているのを見ましたif

if [[ condition ]]

if [ condition ]

if ((condition))

if (condition)

ベストアンサー1

Bourneのようなシェルでは、ifステートメントは通常次のようになります。

if
   command-list1
then
   command-list2
else
   command-list3
fi

thencommand-list1この句は、コマンドリストの終了コードが0の場合に実行されます。終了コードが0でない場合、elseこの句が実行されます。 command-list1それは簡単でも複雑でもかまいません。たとえば、;newlines演算子の1つで区切られた1つ以上のパイプシーケンスです。以下に示す条件は特別な場合に過ぎません。&&&||ifcommand-list1

  1. if [ condition ]

    [test伝統的なコマンドの別の名前です。[/はtest標準POSIXユーティリティです。すべてのPOSIXシェルにはこの機能が組み込まれています(POSIX²では必要ありませんが)。コマンドはtest終了コードを設定し、ifステートメントはそれに応じてアクションを実行します。一般的なテストは、ファイルが存在するか、1つの数字が別の数字と同じかどうかです。

  2. if [[ condition ]]

    testこれは1の新しいアップグレードバリアントです。ケシそれ強く打つ扱いにくいヤッシュ忙しい箱またサポートされます。この[[ ... ]]構成は終了コードも設定し、if文はそれに応じて動作します。拡張機能の中で、文字列がワイルドカードパターンと一致するかどうかをテストできます。忙しい箱)。

  3. if ((condition))

    その他ケシ拡張理論強く打つそして扱いにくいまたサポートされます。これにより算術演算が実行されます。算術の結果、終了コードが設定され、ifそれに応じて文が実行されます。算術計算結果が0でない場合は、終了コード0(true)を返します。同様に、[[...]]この形式はPOSIXではないため、移植性はありません。

  4. if (command)

    これはサブシェルでコマンドを実行します。コマンドが完了すると、終了コードが設定され、ifそれに応じてステートメントが実行されます。

    これらのサブシェルを使用する一般的な理由は、command必要なcommand変数の割り当てやシェル環境への他の変更による副作用を制限するためです。これらの変更は、サブシェルが完了しても維持されません。

  5. if command

    コマンドが実行され、ifステートメントは終了コードに従って動作します。

[ ... ]and には[[ ... ]]周囲にスペースが必要ですが、(...)and((...))には必要ありません。


1 実際のコマンドではありませんが、特殊なシェル構造ですが、構文は通常のコマンドとは異なり、異なるシェル実装の間に大きな違いがあります。

²POSIXにはシステムにスタンドアロンユーティリティが必要ですtestが、[POSIXの場合、[複数のLinuxディストリビューションにはこのユーティリティが不足していることが知られています。

おすすめ記事