我想知道是否从命令行设置了特定的环境变量。我需要区分它被设置为空白字符串(或只是空白)和根本没有设置,所以我想得到一个明确的真/假或是/否,而不是如果没有设置则不打印任何内容。
我知道在脚本中,我可以使用-z
,但我不确定是否/如何可以直接从命令行执行此操作。
我试过这个:
$ echo -z "${MY_URDSFDFS}"
但它只是打印:
-z
答案1
使用以下形式${VAR+TEXT}
参数扩展。如果未设置且已设置,${VAR+1}
则为空,即使它为空。 (如果未设置或为空,则为空,并且如果设置为非空值。)VAR
1
VAR
${VAR:+1}
VAR
1
VAR
if [ -n "${MY_URDSFDFS+1}" ]; then
echo "\$MY_URDSFDFS is set"
else
echo "\$MY_URDSFDFS is not set"
fi
这适用于任何 POSIX 或 Bourne shell,即所有现代甚至最古老的 sh 方言。
这不区分环境变量和shell变量。如果必须拒绝非导出的 shell 变量,可以在单独的进程中进行测试:sh -c 'test -n "${MY_URDSFDFS+1}"'
。但这很少是一个问题。
请注意,这通常是一个坏主意,因为有时取消设置变量很不方便,有时将其设置为空字符串也不方便。通常,空环境变量应与未设置的环境变量同等对待。
答案2
在zsh
shell 中,要测试变量是否已设置,除了标准 之外[ -n "${var+set}" ]
,还可以使用(( $+var ))
,其中如果设置则$+var
扩展为 1 ,否则扩展为 0。$var
请注意,在 中zsh
,当您执行export var
while$var
之前未设置的操作时,除非在或仿真zsh
中运行,否则会自动分配一个值(数字变量为 0,数组/哈希变量为空列表(导出这些变量没有意义),空列表否则),所以这些测试将返回 true。sh
ksh
要测试变量是否已设置以及它是否在环境中,您可以执行以下操作
if [[ -$parameters[var]- = *-export-* ]]; then
echo var is set and exported to the environment
fi
(或${(t)var}
代替$parameters[var]
)。
也可以看看这是“如何检查‘if’语句中是否存在变量?”的答案以便进一步考虑此事。