测试 shell 变量是否已设置

测试 shell 变量是否已设置

我在做

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}"

相关内容