![テストコマンドと[[]]で囲まれた単一条件式の違いは何ですか? [コピー]](https://linux33.com/image/177783/%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%5B%5B%5D%5D%E3%81%A7%E5%9B%B2%E3%81%BE%E3%82%8C%E3%81%9F%E5%8D%98%E4%B8%80%E6%9D%A1%E4%BB%B6%E5%BC%8F%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
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" ]]
同じです。