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


8

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

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

#!/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

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

array1
array2

对此,我将不胜感激。谢谢!


有什么原因使您无法做到for b in "${array1[@]}" "${array2[@]}"; do ...; done
库萨兰达

我希望数组的数量灵活。因此,如果以后再添加一个数组,只需将其添加到array_names中,然后由循环来处理它。
chnppp

我认为这是间接扩展的情况。请参阅stackoverflow.com/questions/8515411/…-但基本上,更改${a[@]}${!a}您想要的(我认为)。
parkamark

1
@parkamark不,这只是给他每个数组的第一个元素。并${!a[@]}给出数组的长度a
库萨兰达

是的,更改${!a}为只是给我第一个要素。
chnppp

Answers:


7

Bash 4.3及更高版本支持“名称引用”或名称引用(在中存在类似的概念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

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

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

all=( "${array1[@]}" "${array2[@]}" )

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

也可以使用eval,但是生成的代码令人震惊。

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



0

作为所说的变化:

#!/bin/bash

array1=('array1 string1' 'array1 string2')
array2=('array2 string1' 'array2 string2')
array_names=('array1' 'array2')

for (( i=0; i<${#array_names[@]}; i++ )); do

    declare -n arr="${array_names[i]}"

    for (( j=0; j<${#arr[@]}; j++ )); do
        echo "${arr[j]}"
    done

done

而是通过索引访问元素

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.