我试图检查字符串是否评估为变量的名称。这在bash中有效:
[[ -z "${!VALUE_OF_VAR}" ]]
但是在ZShell中,它会导致无效的替换。在ZShell中检查变量是否计算为变量名(设置)的等效方法是什么?
与bash
不同,zsh
中的间接展开以不同的方式处理,可以在zsh -官方文档中的参数展开标志
P
这强制将参数名的值解释为另一个参数名,该参数名的值将在适当的地方使用。请注意,使用typeset系列命令之一设置的标志(在特殊情况下的转换)不会应用于以这种方式使用的name值。
如果与嵌套参数或命令替换一起使用,其结果将以同样的方式作为参数名称。例如,如果您有
foo=bar
和bar=baz
,则字符串${(P)foo}
、${(P)${foo}}
和${(P)$(echo bar)}
将扩展为baz
。
采用上述任意一种格式,我认为你需要
[[ -z "${(P)VALUE_OF_VAR}" ]]
如果您想检查$varname
是否计算为已声明变量的名称,您可以简单地使用[[ -v $varname ]]
。
例如:
% varname=var
% var=
% [[ -v $varname ]]; print $?
0
% unset var
% [[ -v $varname ]]; print $?
1