_# 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.
_
私は混乱しています、それはどのようにゼロですかand同時に非ゼロですか? (bash
を使用して)キーに値があるかどうかをどのように確認しますか?
[ .. ]
は、他のすべてのコマンドと同じルールに従います。つまり、 Word Splitting が適用されます。 OUT
が空の場合(または設定されていない場合)、$OUT
は何も展開せず、空の引数はありません。
したがって、[ -n $OUT ]
は[
、-n
および]
に展開され、[
は-n
が空の文字列でないかどうかをテストします。そのため、テストはtrueを返します。
他のほとんどすべての場所と同様に、$OUT
を引用する必要があります。
if [ -n "$OUT" ]; then ...
BashGuideの 二重引用符が必要な場合 および Tests and Conditionals を参照してください。
コマンド
[ -z $OUT ]
完全に等しい
test -z $OUT
これは、$OUT
が空の場合と同じです。
test -z
test
の動作 パラメーターの数によって異なります コマンドラインで指定します。 test -n
またはtest -z
のように単一のパラメーターのみを指定した場合、そのパラメーターの長さがストリングとして解釈されるとゼロ以外であれば、結果は「true」になります。
これは、$OUT
が空で引用符が付けられていない場合、test -z $OUT
とtest -n $OUT
はどちらもゼロ以外の長さの文字列であるため、-z
と-n
はどちらもtrueになることを意味します。 。
これを修正するには、変数展開を二重引用符で囲みます。
[ -n "$OUT" ]
こちらもご覧ください