2つの間に違いはありますか?
[[ $a == z* ]]
そして
[ $a == z* ]
異なる出力が出てくる例を見てもいいですか?
[[ ]]
また、どのように異なる動作をしますか[ ]
?
ベストアンサー1
[[ … ]]
との違いは[ … ]
主に次に反映されます。引用符なしの空白パラメータ拡張が二重括弧 "[["内では機能しますが、単一括弧"["内では機能しないのはなぜですか?。重要なのは[[ … ]]
特別な構文では[
ありません。[[ … ]]
内部コンテンツの特別な文法規則はありません[ … ]
。
ワイルドカードを追加した後の[[ $a == z* ]]
計算は次のようになります。
[[ … ]]
構文解析コマンド:条件式の条件付き構成$a == z*
。- 条件式解析:
==
オペランドが$a
sumの二項演算子ですz*
。 - 最初のオペランドを変数値に拡張します
a
。 - 評価
==
演算子:変数の値がパターンa
と一致するかどうかをテストしますz*
。 - 条件式を評価します。結果は条件演算子の結果です。
- コマンドが評価され、条件式が true の場合は状態が 0 で、条件式が false の場合は 1 になります。
[ $a == z* ]
評価方法は次のとおりです。
- Parseコマンド:、、、
[
単語を評価して引数が形成されたコマンドです$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
単一の単語が予想されるコンテキストにあるため、単語の分割やファイル名の生成には使用されません(条件演算子の左側のパラメータ==
)。ほとんどの場合、変数の拡張は、個々の単語がその場所で意味がある場合は二重引用符内にあるかのように動作します。ただし、この規則には例外があります。では、[[ abc == $a ]]
値にa
ワイルドカード文字が含まれている場合、abc
ワイルドカードパターンと比較されます。たとえば、a
isの値がa*
true(引用符付き拡張子の[[ abc == $a ]]
ワイルドカード文字が一致するため)で、値がfalse(引用符付き拡張子の一般文字が一致しないため)の場合です。内部で二重引用符は違いはありません。*
$a
bc
[[ abc == "$a" ]]
*
$a
bc
[[ … ]]
文字列一致演算子の右側に追加(=
、、、==
そして!=
)=~
。