test -n <expression>
式がゼロより大きい文字列の長さで評価された場合はfalseを返すことがわかります。それでは、なぜ次のようなことが起こりますか?
Macbook:~ echo ${#undeclared_variable}
0
Macbook:~ test -n $undeclared_variable && echo Foo
Foo
スマッシュ4.x
私の期待はtest -n $undeclared_variable
falseと評価されなければならないので、Fooはエコーされてはならないということです。[[ ]]
テストの代わりに使用すると、期待どおりに機能します。
答え1
変数を引用する必要があります。引用符がなければ、test -n
代わりに書いているのですtest -n <expression>
。このtest
コマンドは、何も拡張されていない変数を提供したことを知りません。
POSIXシェル構文のbash
二$VARIABLE
重引用符の外側には、「split + glob」演算子があります。変数の値はスペースで区切られた単語のリストに分割され、各単語はワイルドカードパターンとして解釈され、名前に置き換えられます。一致するファイル(一致するファイルがない場合はそのまま残ります)。変数の値が空の場合、分割ワードのリストは空のリストです。追加の処理なしで変数値を取得するには、変数拡張を二重引用符で囲む必要があります。
これは[[
コマンドではなく bash 特殊な構文であるため、機能します。この特殊な構文は「値」を意味します(および右側のパターン一致$VARIABLE
演算子を除く)。VARIABLE
使用される機能はと同じです。以下はあなたの要件を満たすことができます。=
==
!=
=~
[
test
test -n "$undeclared_variable" && echo "Foo"