これら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と一致しません )。 [[…]]の内部 、二重引用符は、文字列照合演算子の右側を除いて違いはありません。 ( =コード> 、 == 、!= および=〜 。