test -n は予期しない結果を提供します。

test -n は予期しない結果を提供します。

test -n <expression>式がゼロより大きい文字列の長さで評価された場合はfalseを返すことがわかります。それでは、なぜ次のようなことが起こりますか?

Macbook:~ echo ${#undeclared_variable}
0
Macbook:~ test -n $undeclared_variable && echo Foo
Foo

スマッシュ4.x

私の期待はtest -n $undeclared_variablefalseと評価されなければならないので、Fooはエコーされてはならないということです。[[ ]]テストの代わりに使用すると、期待どおりに機能します。

答え1

変数を引用する必要があります。引用符がなければ、test -n代わりに書いているのですtest -n <expression>。このtestコマンドは、何も拡張されていない変数を提供したことを知りません。

POSIXシェル構文のbash$VARIABLE重引用符の外側には、「split + glob」演算子があります。変数の値はスペースで区切られた単語のリストに分割され、各単語はワイルドカードパターンとして解釈され、名前に置き換えられます。一致するファイル(一致するファイルがない場合はそのまま残ります)。変数の値が空の場合、分割ワードのリストは空のリストです。追加の処理なしで変数値を取得するには、変数拡張を二重引用符で囲む必要があります。

これは[[コマンドではなく bash 特殊な構文であるため、機能します。この特殊な構文は「値」を意味します(および右側のパターン一致$VARIABLE演算子を除く)。VARIABLE使用される機能はと同じです。以下はあなたの要件を満たすことができます。===!==~[test

test -n "$undeclared_variable" && echo "Foo"

関連情報