zsh:通过间接引用测试变量的存在性

zsh:通过间接引用测试变量的存在性,zsh,Zsh,如果我想知道变量v是否存在于zsh中,我可以使用${+v}。例如: u=xxx v= print ${+u} ${+v} ${+w} a=xxx b=a print ${(P)b} 产出11 0 如果我想访问一个变量的内容,在变量v中存储了它的名称,我可以使用${(p)v}来访问它。例如: u=xxx v= print ${+u} ${+v} ${+w} a=xxx b=a print ${(P)b} 输出xxx 现在,我想将这两种方法结合起来:测试变量是否存在,但变量的名称存储在另一个

如果我想知道变量v是否存在于zsh中,我可以使用
${+v}
。例如:

u=xxx
v=
print ${+u} ${+v} ${+w}
a=xxx
b=a
print ${(P)b}
产出11 0

如果我想访问一个变量的内容,在变量v中存储了它的名称,我可以使用
${(p)v}
来访问它。例如:

u=xxx
v=
print ${+u} ${+v} ${+w}
a=xxx
b=a
print ${(P)b}
输出xxx

现在,我想将这两种方法结合起来:测试变量是否存在,但变量的名称存储在另一个变量中。我该怎么做?例如:

r=XXX
p=r
q=s
以下是我的方法,但它不起作用:

print ${+${(P)p}}  # Expect 1, because $p is r and r exists.
print ${+${(P)q}}  # Expect 0, because $q is s and s does not exist
但是,我得到了错误消息zsh:bad substitution

有没有一种方法可以在不返回到
eval
的情况下实现我的目标

print ${(P)+p}
print ${(P)+q}
参数扩展标志的左括号需要紧跟在右大括号之后。此外,无需明确替换
p
q
,因为
(p)
会处理这一问题。然而,
${(P)+${P}}
${(P)+${q}}
也会起作用

参数扩展标志的左括号需要紧跟在右大括号之后。此外,无需明确替换
p
q
,因为
(p)
会处理这一问题。然而,
${(P)+${P}}
${(P)+${q}}
也会起作用