
man test
ページから:
-n STRING
the length of STRING is nonzero
STRING equivalent to -n STRING
-z STRING
the length of STRING is zero
実行[ -n $foo ]
、、、、[ -n ]
すべてtrueを[ -z $foo ]
返します[ -z ]
。これは単に不正な戻り値ですか?設定されていない変数は文字列ではありません。表現が完全に省略されたわけでもありません。どういうわけか1になるように「強制」されるとしても、その長さが同時に0でありながら同時に0ではないと考えたくありません。
実際に両方
if [ -n ] && [ -z ]; then
echo 1;
fi
# AND
if [ -n $foo ] && [ -z $foo ]; then
echo 1;
fi
...両方を生成します"1"
。なぜ?ここで何が起こっているのでしょうか?
答え1
質問
テスト条件を解析する方法を誤解しました。
最初のbashはパラメータの数を決定します。
[
との間には]
偽りはありません。- パラメーターが空の場合、パラメーター
true
の内容に関係なく、パラメーター間に空のパラメーターではなく1つのパラメーターしかありません。false
[ '' ]
- シェルは、引数が複数ある場合にのみ内容を確認します。
-z
-n
2番目のパラメータが必要です。あなたのケースにはケースがないので、-z
/として扱われず、-n
結果として処理されますtrue
。
解決策
変数を引用する必要があります(ほとんどの場合のように)。これにより、空の変数は完全に削除されず、空のパラメータとして扱われます。