如何使用包含数组名称的第二个变量引用现有bash数组



当我在发布前搜索答案时,我最接近的最有用的匹配项是:

遍历shell中名称存储在变量中的数组

如何在bash脚本中使用参数/参数名称作为变量

如何使用间接引用迭代数组?

我的尝试部分成功:

#!/bin/bash
declare -a large_furry_mammals
declare -a array_reference  
# I tried both declaring array_reference as an array and 
# not declaring it as an array.  no change in behavior.
large_furry_mammals=(horse zebra gorilla)

size=large
category=mammals
tmp="${size}_furry_${category}"
eval array_reference='$'$tmp
echo tmp=$tmp
echo array_reference[0]=${array_reference[0]}
echo array_reference[1]=${array_reference[1]}

输出

tmp=large_furry_mammals
array_reference[0]=horse
array_reference[1]=

预期

当我回显array_reference[1]时,我本希望得到输出斑马线。

但我遗漏了一些微妙之处。。。

为什么我不能访问索引0以外的索引数组元素?这表明array_reference实际上并没有被视为一个数组。

我不想复制数组。我想引用一个基于指向该数组的变量的静态数组,即${size}_furry_${category}->large_furry_mammals

使用我发布的链接,我已经成功地实现了这里的总体想法,但前提是它不是数组。当它是一个阵列时,它会为我倒下。

附录2018年12月5日

bash 4.3在这种情况下不可用@本杰明的答案确实适用于4.3以下。

我将需要循环遍历生成的数组变量的内容。我举的这个涉及哺乳动物的愚蠢例子只是为了描述这个概念。事实上,这是一个真实的案例。我有一组静态引用数组,会解析一个输入字符串来选择哪个数组是相关的,然后我会在所选的数组上循环。我可以做一个案例陈述,但有100多个引用数组,这将是直接但过于冗长的方法

这个伪代码可能是我所追求的更好的例子。

m1_array=(x a r d)
m2_array=(q 3 fg d)
m3_array=(c e p)
Based on some logic...select which array prefix you need.
x=m1
for each element in ${x}_array
do
some-task
done

我正在对@eduardo的解决方案进行一些测试,看看我是否可以调整他引用变量的方式,以进入我的结局。

**附录#2 2018年12月14日**

解决方案

我找到了!通过使用@eduardo的例子,我得出了以下结果:

#!/bin/bash
declare -a large_furry_mammals
#declare -a array_reference
large_furry_mammals=(horse zebra gorilla)

size=large
category=mammals
tmp="${size}_furry_${category}[@]"
for element in "${!tmp}"
do
echo $element
done

以下是执行的样子。我们成功地迭代了动态构建的数组字符串的元素。

./example3b.sh
horse
zebra
gorilla

谢谢大家。

如果您有Bash 4.3或更新版本,您可以使用namerefs:

large_furry_mammals=(horse zebra gorilla)
size=large
category=mammals
declare -n array_reference=${size}_furry_$category
printf '%sn' "${array_reference[@]}"

带输出

horse
zebra
gorilla

这是一个参考,因此large_furry_mammalsarray_reference:中都反映了变化

$ array_reference[0]='donkey'
$ large_furry_mammals[3]='llama'
$ printf '%sn' "${array_reference[@]}"
donkey
zebra
gorilla
llama
$ printf '%sn' "${large_furry_mammals[@]}"
donkey
zebra
gorilla
llama
declare -a large_furry_mammals
declare -a array_reference
large_furry_mammals=(horse zebra gorilla)
size=large
category=mammals
echo ${large_furry_mammals[@]}
tmp="${size}_furry_${category}"
array_reference=${tmp}"[1]"
eval ${array_reference}='bear'
echo tmp=$tmp
echo ${large_furry_mammals[@]}

最新更新