从另一个数组引用 bash 数组变量

chn*_*ppp 9 bash shell-script

我想编写一个脚本来从另一个包含这些数组变量名的数组中引用多个数组。

到目前为止,这是我的代码:

#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')

array_names=('array1' 'array2')

for a in ${array_names[@]}
do
        for b in ${a[@]}
        do
                echo $b
        done
done
Run Code Online (Sandbox Code Playgroud)

我希望输出扫描两个数组(从外部 for 循环)并在调用 echo 的内部 for 循环中打印相应的字符串。我当前的输出只是向我展示:

array1
array2
Run Code Online (Sandbox Code Playgroud)

我将不胜感激有关于此的任何指示。谢谢!

Kus*_*nda 8

Bash 4.3 及更高版本支持“名称引用”或 namerefs(类似的概念存在于 中ksh93,但范围非常不同):

#!/bin/bash

array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')

array_names=('array1' 'array2')

for a in "${array_names[@]}"; do
    declare -n arr="$a"

    for b in "${arr[@]}"; do
        echo "$b"
    done
done
Run Code Online (Sandbox Code Playgroud)

该变量arr是一个 nameref ,其作用类似于命名变量($a在本示例中为具有 name 的变量)的别名。

如果没有 namerefs,在较早的 Bash 版本中,一种解决方案是创建一个包含其他数组中所有元素的新数组:

all=( "${array1[@]}" "${array2[@]}" )
Run Code Online (Sandbox Code Playgroud)

...有点像问题中的array_names数组,但包含所有数组的内容,然后迭代"${all[@]}".

也可以使用eval,但生成的代码看起来非常糟糕。

请参阅glenn jackman 的答案,了解可变间接性的变体(在 Bash 版本 2 中以其当前形式引入)。