1. ホーム
  2. バッシュ

[解決済み】Bashの[]と[[]の違いは何ですか?[重複しています]

2022-03-24 19:28:10

質問

bashのmanページを見てみると [[ には、条件式を使用すると書いてあります。そこで、条件式のセクションを見てみると、以下の演算子と同じものがリストアップされています。 test (そして [ ).

そこで疑問に思うのですが、この [[[ をBashで使うのですか?

どのように解決するのですか?

[[ は、bashが改良した [ コマンドを使用します。bashをターゲットにしたスクリプトを書く場合、より良い選択肢となるよう、いくつかの機能強化がなされています。私のお気に入りは

  1. シェルの構文的な機能なので、何か特別な動作で [ は持っていない。もう変数を狂ったように引用する必要はありません。 [[ は、空の文字列や空白を含む文字列をより直感的に処理することができます。例えば [ と書く必要があります。

    if [ -f "$file" ]
    
    

    で、空文字列や空白を含むファイル名を正しく処理することができます。また [[ は不要です。

    if [[ -f $file ]]
    
    
  2. 構文的な機能であるため、これによって &&|| 演算子でブーリアン・テストを、そして <> は文字列の比較のために使用します。 [ は、通常のコマンドであるため、これを行うことはできません。 && , || , < および > はコマンドライン引数として通常のコマンドに渡されることはありません。

  3. を搭載しており、素晴らしい =~ 演算子で正規表現にマッチさせることができます。この演算子は [ と書くことができます。

    if [ "$answer" = y -o "$answer" = yes ]
    
    

    [[ と書くことができます。

    if [[ $answer =~ ^y(es)?$ ]]
    
    

    さらに、キャプチャしたグループを BASH_REMATCH . 例えば ${BASH_REMATCH[1]} は、上で "yes" と完全にタイプした場合は "es" となります。

  4. パターンマッチ、別名グロビングを無料で手に入れることができます。もしかしたら、yesと入力する方法について、それほど厳密でないかもしれません。あるいは、ユーザーがy-anythingとタイプしても大丈夫なように。このような場合にも対応できます。

    if [[ $ANSWER = y* ]]
    
    

bashの拡張機能なので、shと互換性のあるスクリプトを書くなら [ . 必ず #!/bin/bash 二重括弧を使用している場合は、スクリプトのシバング行を指定します。

こちらもご覧ください