关联数组,其名称是变量

时间:2017-03-28 11:42:26

标签: zsh

我有这个设置:

typeset -A network
network[interface]=eth0,eth1

typeset -A eth0
eth0[dhcp]=yes
...
typeset -A eth1
eth1[dhcp]=yes
...

我想获取网络[interface]的每个值的dhcp值,我有这个设置:

for InterfaceToCreate in $(echo ${network[interface]/,/ }) ; do
(some stuff)
case ${InterfaceToCreate[dhcp]} in
(some stuff)

如果我尝试使用

,它将无法正常工作
${!InterfaceToCreate[dhcp]}
\${${InterfaceToCreate}[dhcp]}

我甚至尝试使用eval获得相同的结果。

1 个答案:

答案 0 :(得分:1)

默认情况下,参数值不会被解释为其他参数名称。因此,${${foo}}的行为与${foo}相似(请参阅Nested Substitutions)。可以使用parameter expansion flag P更改此行为。例如,${(P)${foo}}将评估${foo}并将其值用作参数替换的名称。

所以你可以达到这样的效果:

typeset -A network eth0 eth1
network[interface]=eth0,eth1
eth0[dhcp]=yes
eth1[dhcp]=no

for InterfaceToCreate in ${(s:,:)network[interface]} ; do
    case ${${(P)InterfaceToCreate}[dhcp]} in
        yes)
            print $InterfaceToCreate DHCP 
            ;;
        *)  
            print $InterfaceToCreate no DHCP
            ;;
    esac
done

这应该显示

eth0 DHCP
eth1 no DHCP

我还建议您使用parameter expansion flag s:string:拆分以逗号分隔的列表,而不是使用echo和命令替换的回旋方式。