私が何をしているのか
local w=""
if [[ -v "$w" ]]; then
echo
printf '%s\n' "VARIABLE SET TEST"
printf '%s\n' " w=\"$w\" | w: $w"
printf '%s\n' \
" [[ -v \"\$w\" ]] TRUE, w is not set to a value by assignment"
printf '%s\n' \
" [[ ! -v \"\$w\" ]] FALSE, w is not set to a value by assignment"
fi
[[ -v "$w" ]]
シェル変数が設定されている場合(値が割り当てられている場合)、Trueを返す必要があります。しかし、これはエラーを返します。
答え1
コメントで述べたように、[[ -v var ]]
変数を使用すると、名前、拡張値ではなく、その値だけでは、設定されていない変数と空の文字列で設定された変数との違いはわかりません。
だから、
[[ -v var ]]
設定されていることをテストしますvar
(ただし空になる可能性があります)。[[ -n "$var" ]]
var
空でない文字列への拡張をテストします。つまり、設定されていて空ではありません。[[ "$var" ]]
同じ上記と[[ -z "$var" ]]
var
空の文字列に展開されているか、つまり設定されていないか空の文字列に設定されているかをテストします。
ただし、set -u
変数が設定されておらず、有効でない場合は、後者の2つが混乱します。"${var-default}"
これを防ぐには、デフォルト値の拡張を使用する必要があります。そして-v
テストは標準ではありません。
ダグの答えすべてのPOSIX様シェルで動作する方法です。
答え2
変数が設定されていることを確認
-z
文字列の長さが0の場合は0(true)を返します。
${var+x}
変数(var)が設定されている場合は、次に展開されます。x
[ -z "${var+x}" ] && echo "variable unset"
-n
文字列の長さが0以外の場合は0(true)を返します。
[ -n "${var+x}" ] && echo "variable set"
変数を確認し、設定されていない場合にエラーを表示するには、次のようにします。
"${var?warn_unset}"
変数が設定されていないことを確認するか、空/文字:
の前に使用されます。+
?
[ -z "${var:+x}" ] && echo "variable unset or empty"
"${var:?warn_unset_or_empty}"