質問

質問

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-n2番目のパラメータが必要です。あなたのケースにはケースがないので、-z/として扱われず、-n結果として処理されますtrue

解決策

変数を引用する必要があります(ほとんどの場合のように)。これにより、空の変数は完全に削除されず、空のパラメータとして扱われます。

おすすめ記事