Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何使用包含数组名称的第二个变量引用现有bash数组?_Arrays_Bash_Loops_For Loop_Indirection - Fatal编程技术网

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-我用你的例子找到了一个解决方案。解决方案添加到我原来的帖子中。简短的故事:我需要在数组赋值语句中添加[@]。我最初的尝试包括构造不带括号的数组名,然后在尝试引用数组元素时在后端使用括号。如果我在初始赋值中包含[@],数组间接引用将起作用。虽然您的示例与我所做的并不直接匹配,但它让我朝着正确的方向开始了。我只限于旧版本,但我想承认这是一个坚实的解决方案。感谢您抽出时间回答。