我在做
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" ]]
如果 shell 变量已设置(已分配值),则应返回 True。但这返回错误。
答案1
正如评论中提到的,[[ -v var ]]
采用变量姓名,而不是扩展值。仅凭该值,它无法区分未设置的变量和设置为空字符串的变量之间的区别。
所以,
[[ -v var ]]
测试是否var
已设置(但可以为空)[[ -n "$var" ]]
测试是否var
扩展为非空字符串,即已设置且非空[[ "$var" ]]
与上面相同[[ -z "$var" ]]
测试是否var
扩展为空字符串,即未设置或设置为空字符串。
但请注意,如果变量未设置且set -u
有效,后两者会发出嘎嘎声。您需要使用默认值扩展"${var-default}"
来避免这种情况。而且-v
测试不标准,看看
达格的回答一种适用于所有类似 POSIX 的 shell 的方法。
答案2
确定变量是否已设置
-z
如果字符串长度为零,则返回 0 (true)。
${var+x}
如果设置了变量 (var),则扩展为x
[ -z "${var+x}" ] && echo "variable unset"
-n
如果字符串长度非零,则返回 0 (true)
[ -n "${var+x}" ] && echo "variable set"
要检查变量并在未设置时显示错误,请使用:
"${var?warn_unset}"
检查变量是否未设置或空的在/字符:
之前使用。+
?
[ -z "${var:+x}" ] && echo "variable unset or empty"
"${var:?warn_unset_or_empty}"