2

我正在尝试扩展通过间接扩展获得的数组中的所有值:

> my_array=(coconut banana)
> echo "${my_array[@]}" 
coconut banana
> my_array_name=my_array
> echo ${!my_array_name}
coconut
> echo "${!my_array_name[@]}"
0

我在最后一个命令中错误地使用了“数组键列表”,因为我不知道如何键入正确的命令?

我想得到:

coconut banana

可能不诉诸一些丑陋eval的黑客..一个烂黑客的例子:

> echo \${$my_array_name[@]}
${my_array[@]}
> eval echo \${$my_array_name[@]}
coconut banana

笔记

my_array可能包含带空格的值!

编辑

在我正在编写的函数中,my_array_name 是通过 "$1" 设置的,所以我不能从字面上使用它。

类似于:https ://unix.stackexchange.com/questions/20171/indirect-return-of-all-elements-in-an-array但我需要避免使用eval以防止脚本在环境在正确的时间被“黑客”了......

4

2 回答 2

4

这应该工作

my_array_name='my_array[@]'
echo "${!my_array_name}"

评论后:您必须使用数组名称和'[@]'创建一个字符串,另一个示例

my_array_name="$1"'[@]'
echo "${!my_array_name}"

评论后:在函数中测试

display_elem() {
  local arrname
  arrname="$1[@]"
  printf "%s\n" "${!arrname}"
}

display_elem my_array
于 2012-10-02T13:33:18.087 回答
1

问题是my_array_name=my_array。您需要检索 的所有值my_array。试试这个:

 my_array_name=${my_array[@]}
 echo "${my_array_name[@]}"
于 2012-10-02T13:32:30.927 回答