PSkocik Asked: 2018-08-31 02:18:32 +0800 CST2018-08-31 02:18:32 +0800 CST 2018-08-31 02:18:32 +0800 CST 测试变量是否未设置 772 是否有一个可移植测试变量(其名称在脚本中静态已知)是否未设置(与空不同)? shell 2 个回答 Voted Best Answer Stéphane Chazelas 2018-08-31T02:20:38+08:002018-08-31T02:20:38+08:00 对于标量变量,在标准 (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 对于数组变量(不是数组是可移植的), inzsh或yash,除非为数组分配了任何列表,包括空列表,否则将返回unset ,而在 bash 或 ksh 中,除非设置了索引 0 的元素,否则将返回 unset 。关联数组也一样(对于键“0”)。 请注意,除了 in zsh(不在sh仿真中时),export var或者readonly var 声明变量但不给它任何值,因此除了在调用/之前已分配值之外的 shellzsh将报告var为unset存在。varexportreadonly user286944 2018-09-01T06:33:09+08:002018-09-01T06:33:09+08:00 POSIX 定义了各种参数扩展来测试参数是否未设置。 查看POSIX 规范! 以下参数扩展可用于测试是否未设置参数。可以指定第二部分(问号之后)以指示参数var未设置。 echo ${var?parameter not set} -sh: var: parameter not set 请注意,使用未定义的参数可能是编程错误。 prompt% sh -u script # or set -o nounset 查看POSIX 规范set中的特殊内置。
对于标量变量,在标准 (POSIX)
sh
语法中:或者更漂亮,虽然不太清晰的东西,比如
或者:
对于数组变量(不是数组是可移植的), in
zsh
或yash
,除非为数组分配了任何列表,包括空列表,否则将返回unset ,而在 bash 或 ksh 中,除非设置了索引 0 的元素,否则将返回 unset 。关联数组也一样(对于键“0”)。请注意,除了 in
zsh
(不在sh
仿真中时),export var
或者readonly var
声明变量但不给它任何值,因此除了在调用/之前已分配值之外的 shellzsh
将报告var
为unset
存在。var
export
readonly
POSIX 定义了各种参数扩展来测试参数是否未设置。
以下参数扩展可用于测试是否未设置参数。可以指定第二部分(问号之后)以指示参数
var
未设置。请注意,使用未定义的参数可能是编程错误。
set
中的特殊内置。