【问题标题】:Loop over two associative arrays in Bash在 Bash 中循环两个关联数组
【发布时间】:2017-09-15 11:52:52
【问题描述】:

假设我在 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 中做到这一点?

【问题讨论】:

    标签: bash associative-array


    【解决方案1】:

    您不想迭代内容;您想遍历数组的 names,然后使用间接扩展从每个数组中获取所需的固定键值。

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

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

    【讨论】:

    • 是的,这正是我一直在寻找的,但它有效吗? $ 用于 a b 中的 arr;做 t=arr[zx]; printf '%s\n' "${!t}";做了一个b
    • 它确实有效,如果你修复我的愚蠢错误(设置t时需要扩展arr)。
    • @chepner : 可能我在这里遗漏了一点,但是对于像 xz 这样的其他索引?
    • @Inian 这个问题只要求使用固定键从一组(可变)数组中输出。
    • @AndreyRomanchev 不,t=$arr[zx]。您还没有索引数组;您只需要一个包含数组名称的字符串($arr 扩展为 ab,具体取决于您正在进行的迭代),后跟固定字符串 [zx]。现在ta[zx]b[zx],您可以使用t 的间接扩展来获得所需的数组元素。
    【解决方案2】:

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

    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
    

    一种普遍的良好做法是总是bash 中引用 (for key in "${!a[@]}") 您的数组扩展,这样元素就不会受到 shell 的分词。

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2015-05-19
      • 2015-01-07
      • 2021-11-24
      • 1970-01-01
      • 2014-01-16
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多