我试着检查一个字符串是否等于一个变量的名字。
[[ -z "${!VALUE_OF_VAR}" ]]
但是在ZShell中,它会导致无效的替换。在ZShell中,如果一个变量的值等于变量的名称(被设置),那么等价的检查是什么?
7vux5j2d1#
如果 要 检查 $varname 是否 计算 为 set 参数 的 名称 , 只需 使用 [[ -v $varname ]] 即可 。例如 :
$varname
[[ -v $varname ]]
% varname=var % var= % [[ -v $varname ]]; print $? 0 % unset var % [[ -v $varname ]]; print $? 1
中 的 每 一 个
pbpqsu0x2#
与bash不同,间接扩展在zsh中以不同的方式进行处理,可以在zsh -官方文档中的Parameter expansion flags下找到
bash
zsh
P
这会胁迫将参数名称的值解译为进一步的参数名称,并在适当的地方使用该值。请注意,以排版系列命令之一设定的旗标(在特定情况下为转换)不会套用至以这种方式使用的名称值。如果与嵌套参数或命令替换一起使用,则其结果将以相同的方式作为参数名。例如,如果有foo=bar和bar=baz,则字符串${(P)foo}、${(P)${foo}}和${(P)$(echo bar)}将扩展为baz。采用上述格式,我认为您需要
foo=bar
bar=baz
${(P)foo}
${(P)${foo}}
${(P)$(echo bar)}
baz
[[ -z "${(P)VALUE_OF_VAR}" ]]
2条答案
按热度按时间7vux5j2d1#
如果 要 检查
$varname
是否 计算 为 set 参数 的 名称 , 只需 使用[[ -v $varname ]]
即可 。例如 :
中 的 每 一 个
pbpqsu0x2#
与
bash
不同,间接扩展在zsh
中以不同的方式进行处理,可以在zsh -官方文档中的Parameter expansion flags下找到这会胁迫将参数名称的值解译为进一步的参数名称,并在适当的地方使用该值。请注意,以排版系列命令之一设定的旗标(在特定情况下为转换)不会套用至以这种方式使用的名称值。
如果与嵌套参数或命令替换一起使用,则其结果将以相同的方式作为参数名。例如,如果有
foo=bar
和bar=baz
,则字符串${(P)foo}
、${(P)${foo}}
和${(P)$(echo bar)}
将扩展为baz
。采用上述格式,我认为您需要