在发帖前搜索到的最相关和有用的问题:
我的尝试并取得部分成功:
#!/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不可用。@benjamin的答案在4.3以下版本中有效。
我需要循环遍历生成的数组变量内容。我给出的哺乳动物的愚蠢示例只是为了描述这个概念。实际上,这周围有一个真实世界的案例。我有一组静态参考数组,并且将解析输入字符串以选择相关的数组,然后我将循环遍历所选的数组。我可以使用case语句,但对于超过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
谢谢大家。