测试变量是否未设置

测试变量是否未设置

是否有可移植的测试来确定变量(其名称在脚本中静态已知)是否未设置(与空不同)?

答案1

对于标量变量,采用标准 (POSIX)sh语法:

if [ "${var+set}" != set ]; then
  echo var is not set
fi

或者更漂亮但不太清晰的东西,比如

if [ -z "${var++}" ]; then
  echo var is unset
fi

或者:

if ${var+false}; then
  echo var is unset
fi

对于数组变量(不是说数组是便携的),在zsh或中yash,除非为数组分配了任何列表(包括空列表),否则将返回 unset,而在 bash 或 ksh 中将返回未设置除非设置了索引 0 的元素。与关联数组相同(对于键“0”)。

请注意,除了zsh(当不在sh仿真中时),export varreadonly var 宣称该变量但不给它任何值,因此除此之外的 shellzsh都会报告var为该unset变量(除非var在调用export/之前已分配了值readonly)。

答案2

POSIX 定义了各种参数扩展来测试参数是否未设置。

以下参数扩展可用于测试是否未设置参数。可以指定第二部分(问号之后)来指示该参数var未设置。

echo ${var?parameter not set}
-sh: var: parameter not set

请注意,使用未定义的参数可能会导致编程错误。

prompt% sh -u script   # or set -o nounset

相关内容