私が何をしているのか
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様シェルで動作する方法です。