Arrays 如何使用包含数组名称的第二个变量引用现有bash数组?
在发布前搜索答案时,我最接近的最有用的匹配项:Arrays 如何使用包含数组名称的第二个变量引用现有bash数组?,arrays,bash,loops,for-loop,indirection,Arrays,Bash,Loops,For Loop,Indirection,在发布前搜索答案时,我最接近的最有用的匹配项: #!/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 goril
#!/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]}
我的尝试部分成功:
#!/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\u reference[1]
时,我本来希望得到输出斑马线
…但我缺少一些微妙之处
为什么我不能访问索引0之外的索引数组元素?
这表明array\u reference
实际上并没有被视为数组
我不想复制阵列。我想引用(将是什么)一个基于指向该数组的变量的静态数组,即${size}{u furry}{uu furry{category}
->large\u furry}
我已经成功地使用了我发布的链接,但前提是它不是数组。当它是一个数组时,它会落在我身上
附录2018年12月5日
在这种情况下,Bash4.3不可用@本杰明的答案在第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
谢谢大家。如果您有Bash 4.3或更新版本,您可以使用:
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[@]}
有输出
horse
zebra
gorilla
这是一个参考,因此变化反映在大型毛皮哺乳动物
和阵列
参考中:
$ array_reference[0]='donkey'
$ large_furry_mammals[3]='llama'
$ printf '%s\n' "${array_reference[@]}"
donkey
zebra
gorilla
llama
$ printf '%s\n' "${large_furry_mammals[@]}"
donkey
zebra
gorilla
llama
当你想间接地做某事时,你应该首先尝试直接做。不可能在已经不起作用的东西上添加间接寻址。有关如何复制数组的信息,请参见array\u参考
将是一个副本。如果修改数组参考[0]
,大型毛茸茸的哺乳动物[0]
将保持不变。好的,更新了,现在请注意它是如何将斑马变成熊的,但您会看到我正在对数组项1进行评估,因此我必须花更多时间给出完整的示例。我现在必须离开了,但至少它向您展示了一种作为指针的方式。我认为这将是最适合我的用例的解决方案。现在看看。我会在一天左右的时间内更新,在我用各种方法测试过之后。谢谢@Eduardo。这是一个有趣的练习,真的很烦人。我会看看今晚晚些时候或明天我是否会尝试一个更干净的解决方案。@Eduardo-我用你的例子找到了一个解决方案。解决方案添加到我原来的帖子中。简短的故事:我需要在数组赋值语句中添加[@]。我最初的尝试包括构造不带括号的数组名,然后在尝试引用数组元素时在后端使用括号。如果我在初始赋值中包含[@],数组间接引用将起作用。虽然您的示例与我所做的并不直接匹配,但它让我朝着正确的方向开始了。我只限于旧版本,但我想承认这是一个坚实的解决方案。感谢您抽出时间回答。