web-dev-qa-db-ja.com

[[$ a == z *]]と[$ a == z *]の違いは何ですか?

これら2つの間に違いはありますか?.

[[ $a == z* ]]

そして

[ $a == z* ] 

出力が異なる例を教えてください。

さらに、[[ ]] とは異なり [ ]

36
munish

_[[ … ]]_と_[ … ]_の違いは、主に シングルまたはダブルブラケットの使用-bash で説明されています。重要なことに、_[[ … ]]_は特別な構文ですが、_[_はコマンドの変な名前です。 _[[ … ]]_には内部に特別な構文規則がありますが、_[ … ]_にはありません。

ワイルドカードのしわが追加された状態で、_[[ $a == z* ]]_が評価される方法を次に示します。

  1. コマンドを解析します。これは、条件式_[[ … ]]_を囲む_$a == z*_条件付き構成です。
  2. 条件式を解析します。これは、オペランド_==_および_$a_を含む_z*_二項演算子です。
  3. 最初のオペランドを変数aの値に展開します。
  4. _==_演算子を評価します。変数aの値がパターン_z*_と一致するかどうかをテストします。
  5. 条件式を評価します。その結果は条件演算子の結果です。
  6. コマンドが評価され、条件式が真の場合はステータスが0になり、偽の場合は1になりました。

_[ $a == z* ]_の評価方法は次のとおりです。

  1. コマンドを解析します。これは、単語_[_、_$a_、_==_、_z*_を評価することによって形成された引数を持つ_]_コマンドです。
  2. _$a_を変数aの値に展開します。
  3. コマンドのパラメータでワード分割とファイル名生成を実行します。
    • たとえば、aの値が6文字の文字列_foo b*_(例:_a='foo b*'_で取得)で、現在のディレクトリ内のファイルのリストが(barbazquxzimzum)の場合、展開の結果は次の単語リストになります:_[_、 foobarbaz、_==_、zimzum、_]_。
  4. 前のステップで取得したパラメーターを使用して、コマンド_[_を実行します。
    • 上記の例の値では、_[_コマンドは構文エラーを報告し、ステータス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"

0
harish.venkat