# touch $$
# gzip $$
# gzip --test $$.gz
# echo $?
0
# OUT=$(gzip --test $$.gz)
# echo $OUT
# if [ -z $OUT ] ; then echo $$ ; fi
26521
# if [ -n $OUT ] ; then echo $$ ; fi
26521
#
~からbash(1)
-z string True if the length of string is zero. string -n string True if the length of string is non-zero.
混乱しています。どのようにゼロになりますか?そして同時にゼロではありませんか?キーに値(使用済み)があるかどうかを確認するにはbash
?
答え1
[ .. ]
他のすべてのコマンドと同じ規則に従います。噴射適用可能です。OUT
空または設定されていない場合は、空の引数で$OUT
なくても何も拡張されません。
したがって、および[ -n $OUT ]
に展開され、空の文字列ではないかどうかをテストします。はい、テストはtrueを返します。[
-n
]
[
-n
$OUT
他の場所と同様に見積もりが必要です。
if [ -n "$OUT" ]; then ...
望むより:いつ二重引用符が必要ですか? そしてテストと条件BashGuideから。
答え2
注文する
[ -z $OUT ]
まったく同じ
test -z $OUT
空の場合は$OUT
次のようになります。
test -z
行動test
パラメータの数によって異なりますコマンドラインで提供されます。test -n
orのように単一の引数のみが与えられ、その引数test -z
の長さ(文字列として解釈されるとき)がゼロでない場合、結果は「true」です。
つまり、空$OUT
で引用符がない場合と両方の長さがゼロ以外の文字列であるため、両方が真にtest -z $OUT
なりますtest -n $OUT
。-z
-n
この問題を解決するには、変数拡張を二重引用符で囲みます。
[ -n "$OUT" ]
また、見ることができます