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!
withがwithであるかoptionであるかに関係なく、
test
withがvar_assigned_with_emptystring
常に正しい結果を提供するのはなぜですか?囲まれたコマンドと単一条件式の違いは何ですか?-n
-z
test
[[]]
""
これらとそしての違いは何ですかvar_assigned_with_emptystring
?パラメータは、""
テスト関数によって内部的に処理されるのと同じ値に拡張(または評価)する必要があると思います。しかし、test -n $var_assigned_with_emptystring
別の戻り状態を提供しますtest -n ""
ベストアンサー1
これは主に扱われます。引用符なしの空白パラメータ拡張が二重括弧 "[["内では機能しますが、単一括弧"["内では機能しないのはなぜですか?。簡単に言えば、[[ … ]]
他の構文解析ルールを使用する特殊な構文であるのに対して、test
および[
は一般的なコマンドです。
一般形式sh
(ksh
などを含む)では、bash
二重引用符がないため、test -n $var
値に分割とワイルドカードが適用されます。var
二重括弧内にはこれは発生しません。
違いzsh
はzsh
、ほとんどの場合、変数拡張に二重引用符を使用する必要がないことです。ただし、リストコンテキスト(コマンドラインなど)$var
には1つの違いがあります"$var"
。単語が空で引用符がない場合はzsh
削除されます。したがって、引数var
が 1 のコマンドは値が空の場合は "true" でtest -n $var
、空でない引数が 1 のコマンドは "true" です。ただし、2つのパラメータと空の文字列を使用して「false」の空の文字列にテストを適用するコマンドです。test
-n
test
test -n "$var"
test
-n
-n
内部的に[[ … ]]
は null 単語除去が発生しないので、[[ -n $var ]]
とは[[ -n "$var" ]]
同じです。