在 zshexpn 手册页(zsh 版本 5.1.1)中,我们有:
参数扩展标志
(P):这强制参数名称的值被解释为进一步的参数名称,其值将在适当的情况下使用。请注意,使用排版命令系列之一(特别是转换)设置的标志不适用于以此方式使用的名称值。
因此,如果我有一个常规数组参数,我可以这样做:
typeset -a array
array=(x y)
ptr=array
echo ${${(P)ptr}[1]}
这将输出x
.我认为这是因为-a
排版标志不需要将参数标记为数组。
但如果我对关联数组执行相同的操作:
typeset -A assoc
assoc=(foo x bar y)
ptr=assoc
echo ${${(P)ptr}[foo]}
屏幕上没有打印任何内容。这看起来与上面的手册页消息一致,因为如果我们运行:
echo ${(P)ptr}
# returns: x y
echo ${${(P)ptr}[1]}
# returns: x
echo ${${(P)ptr}[2]}
# returns: y
我们得到的行为就好像标志-A
totypeset
被丢弃一样,并且我们有一个普通的数组。
但如果我运行以下命令:
echo ${(Pk)ptr}
# returns: foo bar
echo ${(Pv)ptr}
# returns: x y
echo ${(Pkv)ptr}
# returns: foo x bar y
那么似乎在某种意义上关联数组状态并不总是丢失。所以我真的不明白为什么它被设计成typeset
丢弃标志,而看起来他们并不总是这样做。
主要是,我的问题是:有没有办法做到这一点:
echo ${${(P)ptr}[foo]}
返回x
(与 key 关联的值foo
),就好像该typeset -A
标志没有被丢弃一样,我可以像任何其他关联数组一样对待它。我想不是求助于使用eval
s:是否有一些我可以使用的 zsh 参数技巧?