测试变量是否未设置

PSk*_*cik 9 shell

是否有针对变量(其名称在脚本中静态已知)是否未设置(不同于空值)的可移植测试?

Sté*_*las 18

对于标量变量,在标准 (POSIX)sh语法中:

if [ "${var+set}" != set ]; then
  echo var is not set
fi
Run Code Online (Sandbox Code Playgroud)

或者更高级但不太清晰的东西,比如

if [ -z "${var++}" ]; then
  echo var is unset
fi
Run Code Online (Sandbox Code Playgroud)

或者:

if ${var+false}; then
  echo var is unset
fi
Run Code Online (Sandbox Code Playgroud)

对于数组变量(不是数组是可移植的), inzshyash将返回 unset ,除非为数组分配了任何列表,包括空列表,而在 bash 或 ksh 中,除非设置了索引 0 的元素,否则将返回unset。关联数组也是如此(对于键“0”)。

请注意,除了 in zsh(当不在sh仿真中时),export var或者readonly var 声明了变量但没有给它任何值,因此除此之外的shellzsh将报告varunset那里(除非var在调用export/之前已分配了一个值readonly)。

  • @PSkocik,`${var+set}` 扩展为 `set`,无论值如何,当设置 var 时都不为 null。您不能使用 `${var-unset}`,因为如果 var 包含未设置,它会给出误报。 (3认同)