2017-09-15 81 views
1

说我有Bash中循环了两个关联数组

declare -A a 
declare -A b 
a[xz]=1 
b[xz]=2 
a[zx]=3 
b[zx]=4 

两种缔阵列我想要做这样的事情

for arr in ${a[@]} ${b[@]}; do echo ${arr[zx]}; done 

,并在输出得到3和4

但我得到

$ for arr in ${a[@]} ${b[@]}; do echo ${arr[zx]}; done 
1 
3 
2 
4 

有没有办法在Bash中做到这一点?

回答

1

你不想遍历内容;你想遍历数组的名称,然后使用间接扩展从每个数组中获得所需的固定键值。

for arr in a b; do 
    t=$arr[zx] # first a[zx], then b[zx] 
    printf '%s\n' "${!t}" 
done 

这里,用于间接扩展的变量“名称”是数组的名称以及所需的索引。

+0

是的,这正是我正在寻找的,但它工作吗? $ for a arr in a b; do t = arr [zx]; printf'%s \ n'“$ {!t}”;完成 a b –

+0

如果你解决了我的愚蠢错误('arr'需要在设置't'时需要扩展),它才能工作。 – chepner

+0

@chepner:可能我在这里错过了一个观点,但对于像xz这样的其他指标? – Inian

1

假设两个数组中的键匹配(一个主要假设),您可以使用一个数组作为参考并循环遍历键并在每个数组中打印。

for key in "${!a[@]}"; do 
    printf "Array-1(%s) %s Array-2(%s) %s\n" "$key" "${a[$key]}" "$key" "${b[$key]}" 
done 

它产生如下输出。您当然可以删除仅用于理解目的而添加的花式调试字(Array-1Array-2)。

Array-1(xz) 1 Array-2(xz) 2 
Array-1(zx) 3 Array-2(zx) 4 

一个一般好的做法是总是报价(for key in "${!a[@]}")在bash你的阵列扩展,使元件不被壳经历字分裂。

+1

是的,我想这会做的伎俩。谢谢。 –