201

私はbashの例を読んでifいますが、いくつかの例は単一の角括弧で書かれています:

if [ -f $param ]
then
  #...
fi

その他の二重角括弧:

if [[ $? -ne 0 ]]
then
    start looking for errors in yourlog
fi

違いはなんですか?

4

7 に答える 7

235

Single[]は posix シェル準拠の条件テストです。

Double[[]]は標準の拡張機能であり、[]bash およびその他のシェル (zsh、ksh など) でサポートされています。それらは追加の操作をサポートします (標準の posix 操作と同様に)。例:||の代わりに-oおよび と一致する正規表現=~。違いのより完全なリストは、bash マニュアルの条件付き構造に関するセクションにあります。

[]スクリプトをシェル間で移植できるようにしたい場合はいつでも使用してください。[[]]でサポートされ[]ておらず、移植可能である必要のない条件式が必要な場合に使用します。

于 2012-11-24T15:59:25.173 に答える
17

条件テストのための一重括弧 (つまり [ ... ]) 内では、 single などの一部の演算子=はすべてのシェルでサポートされていますが、演算子の使用は==一部の古いシェルではサポートされていません。

条件テストの二重括弧内 ([[ ... ]] など) では、古いシェルと新しいシェルのどちら=を使用しても違いはありません。==

編集: また、次の点にも注意してください: bash では、可能であれば常に二重括弧 [[ ... ]] を使用します。これは、一重括弧よりも安全だからです。その理由を次の例で説明します。

if [ $var == "hello" ]; then

$var が null または空の場合、スクリプトは次のように認識します。

if [ == "hello" ]; then

これはスクリプトを壊します。解決策は、二重括弧を使用するか、常に変数を引用符で囲むことを忘れないでください ( "$var")。二重括弧は、防御的なコーディングの実践として優れています。

于 2012-11-24T15:59:11.710 に答える
14

[[[コマンドに似た (しかしより強力な) bash キーワードです。

見る

http://mywiki.wooledge.org/BashFAQ/031およびhttp://mywiki.wooledge.org/BashGuide/TestsAndConditionals

POSIX sh 用に書いているのでなければ、 をお勧めし[[ます。

于 2012-11-24T16:17:18.757 に答える
1

Bash のマニュアルには次のように書かれています。

[[ とともに使用すると、'<' および「>」演算子は、現在のロケールを使用して辞書順でソートします。test コマンドは ASCII 順序を使用します。

(テストコマンドは [ ] と同じです)

于 2015-10-28T23:43:40.947 に答える
1

軽い正規表現マッチングに二重角かっこを使用できます。たとえば、次のようになります。

if [[ $1 =~ "foo.*bar" ]] ; then

(使用している bash のバージョンがこの構文をサポートしている限り)

于 2012-11-24T15:58:48.293 に答える