[[-z]]と[[-v]]の構文が異なるのはなぜですか?

[[-z]]と[[-v]]の構文が異なるのはなぜですか?

指定された変数が設定されていないコマンドを実行するには、次のようにします。

if [[ -z "$a" || -z "$v" ]]
then
  echo "a or b are not set"
fi

ただし、同じ構文が適用されないため、以下を使用する必要が-vあります。

if [[ -v a && -v b ]]
then
  echo "a & b are set"
fi

この背後に隠された歴史は何ですか?構文がなぜ違うのかわかりません。私はこれが-vbashに最近追加されたと読んだ。(4.2)

答え1

テスト演算子は同じでは-vあり-zません。

演算子は-z文字列が空であることを確認します。したがって、これは[[ -z "$a" ]]「変数が設定されていません」の良い近似を提供しますが、a完璧な近似ではありません。

  • a設定されていない代わりに空の文字列に設定されている場合、式はtrueを生成します。

  • a設定せずに nounsetこのオプションを有効にすると、インクルードスクリプトは失敗します。

一方、変数は極端な場合でも-v a正確に「設定」されますa。 toの $a代わりに渡すことは、テストオペレータが表示する前に設定できない可能性がある変数を拡張するため、変数(名前で指定)を確認して設定するかどうかを判断する必要があることを明確にする必要があります。オペレーターの使命。a-v

答え2

-zそして他の意味があります-v

echo Empty:
x=""  # Same with x=
[[ -z $x ]] && echo z
[[ -v  x ]] && echo v
unset x

echo Unset
[[ -z $x ]] && echo z
[[ -v  x ]] && echo v

を使用すると、-zNULL値が割り当てられた変数と値が割り当てられていない変数を区別することはできません。

しかもそうしないのが[[ -z $x ]]賢明です。set -u[[ -v x ]]

関連情報