bash - 文字列の長さが0(ゼロ以外)の場合は真ですか? [コピー]

bash - 文字列の長さが0(ゼロ以外)の場合は真ですか? [コピー]
# 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 -norのように単一の引数のみが与えられ、その引数test -zの長さ(文字列として解釈されるとき)がゼロでない場合、結果は「true」です。

つまり、空$OUTで引用符がない場合と両方の長さがゼロ以外の文字列であるため、両方が真にtest -z $OUTなりますtest -n $OUT-z-n

この問題を解決するには、変数拡張を二重引用符で囲みます。

[ -n "$OUT" ]

また、見ることができます

関連情報