これら2つの間に違いはありますか?.
[[ $a == z* ]]
そして
[ $a == z* ]
出力が異なる例を教えてください。
さらに、[[ ]]
とは異なり [ ]
?
_[[ … ]]
_と_[ … ]
_の違いは、主に シングルまたはダブルブラケットの使用-bash で説明されています。重要なことに、_[[ … ]]
_は特別な構文ですが、_[
_はコマンドの変な名前です。 _[[ … ]]
_には内部に特別な構文規則がありますが、_[ … ]
_にはありません。
ワイルドカードのしわが追加された状態で、_[[ $a == z* ]]
_が評価される方法を次に示します。
[[ … ]]
_を囲む_$a == z*
_条件付き構成です。==
_および_$a
_を含む_z*
_二項演算子です。a
の値に展開します。==
_演算子を評価します。変数a
の値がパターン_z*
_と一致するかどうかをテストします。_[ $a == z* ]
_の評価方法は次のとおりです。
[
_、_$a
_、_==
_、_z*
_を評価することによって形成された引数を持つ_]
_コマンドです。$a
_を変数a
の値に展開します。a
の値が6文字の文字列_foo b*
_(例:_a='foo b*'
_で取得)で、現在のディレクトリ内のファイルのリストが(bar
、baz
、qux
、zim
、zum
)の場合、展開の結果は次の単語リストになります:_[
_、 foo
、bar
、baz
、_==
_、zim
、zum
、_]
_。[
_を実行します。[
_コマンドは構文エラーを報告し、ステータス2を返します。注:_[[ $a == z* ]]
_のステップ3では、a
の値はWordの分割とファイル名の生成を受けません。これは、単一のWordが期待されるコンテキスト(の左側の引数条件演算子_==
_)。ほとんどの場合、その位置で1つのWordが意味をなす場合、変数の展開は二重引用符でのように動作します。ただし、その規則には例外があります。_[[ abc == $a ]]
_では、a
の値にワイルドカードが含まれている場合、a
はワイルドカードパターンと照合されます。たとえば、a
の値が_a*
_である場合、_[[ abc == $a ]]
_はtrueです(_*
_の引用符で囲まれていない展開からのワイルドカード_$a
_は_*
_)一方、_[[ abc == "$a" ]]
_はfalseです(_*
_の引用符で囲まれた展開からの通常の文字_$a
_はbc
と一致しないため)。 _[[ … ]]
_内では、二重引用符は違いを生じさせませんストリング一致演算子の右側を除きます(_=
_、_==
_、_!=
_および_=~
_)。
どちらも式の評価に使用され、[[はPOSIXの古いボーンシェルでは機能しません。[[はパターンマッチングと正規表現もサポートしています。これらを試してみてください
[ $n -eq 0 -a $y -eq 0 ] && echo "Error" || echo "Ok"
[[ $n -eq 0 && $y -eq 0 ]] && echo "Error" || echo "Ok"