web-dev-qa-db-ja.com

bash-文字列の長さが(非)ゼロの場合はtrue?

_# 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を使用して)キーに値があるかどうかをどのように確認しますか?

4
alexus

[ .. ]は、他のすべてのコマンドと同じルールに従います。つまり、 Word Splitting が適用されます。 OUTが空の場合(または設定されていない場合)、$OUTは何も展開せず、空の引数はありません。

したがって、[ -n $OUT ][-nおよび]に展開され、[-nが空の文字列でないかどうかをテストします。そのため、テストはtrueを返します。

他のほとんどすべての場所と同様に、$OUTを引用する必要があります。

if [ -n "$OUT" ]; then ...

BashGuideの 二重引用符が必要な場合 および Tests and Conditionals を参照してください。

10
ilkkachu

コマンド

[ -z $OUT ]

完全に等しい

test -z $OUT

これは、$OUTが空の場合と同じです。

test -z

testの動作 パラメーターの数によって異なります コマンドラインで指定します。 test -nまたはtest -zのように単一のパラメーターのみを指定した場合、そのパラメーターの長さがストリングとして解釈されるとゼロ以外であれば、結果は「true」になります。

これは、$OUTが空で引用符が付けられていない場合、test -z $OUTtest -n $OUTはどちらもゼロ以外の長さの文字列であるため、-z-nはどちらもtrueになることを意味します。 。

これを修正するには、変数展開を二重引用符で囲みます。

[ -n "$OUT" ]

こちらもご覧ください

4
Kusalananda