我有这个设置:
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获得相同的结果。
答案 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
和命令替换的回旋方式。