これら2つの間に違いはありますか。
[[ $a == z* ]]
および
[ $a == z* ]
異なる出力を持つ例を教えてもらえますか?
さらに、 [[]]
の動作はどのようになりますか []
とは異なります ?
承認された回答:
[[…]]
の違い および[…]
引用符のないスペースを使用したパラメータ展開は、二重角かっこ「[[」内では機能するが、単一角かっこ「[」内では機能しないのはなぜですか?。
重要なのは、[[…]]
は特別な構文ですが、 [
コマンドの変な名前です。 [[…]]コード> 中身についての特別な構文規則があります、
[…]
しません。
ワイルドカードのしわが追加されたので、 [[$ a ==z *]]
の方法は次のとおりです。 評価されます:
- コマンドを解析します:これは
[[…]]
です 条件式$a ==z *
の周りの条件付き構文 。 - 条件式を解析します。これは
==
です。 二項演算子、オペランド$ a
およびz*
。 - 最初のオペランドを変数
a
の値に展開します 。 -
==
を評価します 演算子:変数a
の値をテストします パターンz*
に一致します 。 - 条件式を評価します。その結果は条件付き演算子の結果です。
- コマンドが評価されるようになりました。条件式がtrueの場合はステータスが0、falseの場合はステータスが1になります。
[$ a ==z *]
の方法は次のとおりです。 評価されます:
- コマンドを解析します:これは
[
です$ a
という単語を評価して形成された引数を使用したコマンド 、==
、z *
、]コード> 。
-
$ a
を展開します 変数a
の値に 。 - コマンドのパラメーターで単語の分割とファイル名の生成を実行します。
- たとえば、
a
の値が 6文字の文字列foob *
(例:a ='foo b *'
)および現在のディレクトリ内のファイルのリストは(bar
、baz
、qux
、zim
、zum
)、展開の結果は次の単語のリストになります:[
、foo
、バーコード> 、
baz
、==
、zim
、zum
、]コード> 。
- たとえば、
- コマンド
[
を実行します 前のステップで取得したパラメータを使用します。- 上記の値の例では、
[
コマンドは構文エラーを要求し、ステータス2を返します。
- 上記の値の例では、
注: [[$ a ==z *]]
で 、ステップ3で、 a
の値 単一の単語が期待されるコンテキストにあるため、単語の分割やファイル名の生成は行われません(条件演算子 ==
の左側の引数) )。ほとんどの場合、その位置で1つの単語が意味をなす場合、変数の展開は二重引用符の場合と同じように動作します。ただし、そのルールには例外があります。 [[abc ==$ a]]
、 a
の値の場合 ワイルドカードが含まれ、次に abc
ワイルドカードパターンと照合されます。たとえば、 a
の値が a *
です 次に[[abc==$ a]]
true(ワイルドカード *
のため) $ a
の引用符で囲まれていない展開から来る bc
に一致 )一方、 [[abc =="$ a"]]
falseです(通常の文字 *
のため) $ a
の引用された拡張から来る bc
と一致しません )。 [[…]]
の内部 、二重引用符は、文字列照合演算子の右側を除いて違いはありません。 ( =コード> 、
==
、!=
および=〜
。