テストコマンドと[[]]で囲まれた単一条件式の違いは何ですか? [コピー]

テストコマンドと[[]]で囲まれた単一条件式の違いは何ですか? [コピー]

zshの条件式部分を学んでいますが、言葉にならない出力が表示されます。

たとえば、

$ mkdir emptyspace && cd emptyspace
$ var_assigned_with_emptystring=""

$ [[ -n $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a nonzero-len string!'
$ [[ -n "" ]] && echo '"" is a nonzero-len string!'

$ test -n $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a nonzero-len string by test!'
var_assigned_with_emptystring is a nonzero-len string by test!
$ test -n "" && echo '"" is a nonzero-len string by test!' 

----------


$ [[ -z $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a zero-len string!'
var_assigned_with_emptystring is not an empty string!
$ [[ -z "" ]] && echo '"" is a zero-len string!'
"" is a zero-len string!

$ test -z $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a zero-len string by test!'
var_assigned_with_emptystring is a zero-len string by test!
$ test -z "" && echo '"" is a zero-len string by test!'
"" is a zero-len string by test!

  1. withがwithであるかoptionであるかに関係なく、testwithがvar_assigned_with_emptystring常に正しい結果を提供するのはなぜですか?囲まれたコマンドと単一条件式の違いは何ですか?-n-ztest[[]]

  2. ""これらとそしての違いは何ですかvar_assigned_with_emptystring?パラメータは、""テスト関数によって内部的に処理されるのと同じ値に拡張(または評価)する必要があると思います。しかし、test -n $var_assigned_with_emptystring別の戻り状態を提供しますtest -n ""

ベストアンサー1

これは主に扱われます。引用符なしの空白パラメータ拡張が二重括弧 "[["内では機能しますが、単一括弧"["内では機能しないのはなぜですか?。簡単に言えば、[[ … ]]他の構文解析ルールを使用する特殊な構文であるのに対して、testおよび[は一般的なコマンドです。

一般形式shkshなどを含む)では、bash二重引用符がないため、test -n $var値に分割とワイルドカードが適用されます。var二重括弧内にはこれは発生しません。

違いzshzsh、ほとんどの場合、変数拡張に二重引用符を使用する必要がないことです。ただし、リストコンテキスト(コマンドラインなど)$varには1つの違いがあります"$var"。単語が空で引用符がない場合はzsh削除されます。したがって、引数varが 1 のコマンドは値が空の場合は "true" でtest -n $var、空でない引数が 1 のコマンドは "true" です。ただし、2つのパラメータと空の文字列を使用して「false」の空の文字列にテストを適用するコマンドです。test-ntesttest -n "$var"test-n-n

内部的に[[ … ]]は null 単語除去が発生しないので、[[ -n $var ]]とは[[ -n "$var" ]]同じです。

おすすめ記事