如何从名称扩展数组内容?

Een*_*oku 3 bash array bash-expansion

我有一个数组

declare -a arr0=("'1 2 3'" "'4 5 6'")
Run Code Online (Sandbox Code Playgroud)

和一个变量

x=0
Run Code Online (Sandbox Code Playgroud)

然后我用数组的名称创建新变量

tmp="arr$x"
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样扩展arr0这个tmp变量的内容

newArr=( "${!tmp}" )
Run Code Online (Sandbox Code Playgroud)

newArr像普通数组一样使用,例如使用索引等。


但是当我现在尝试打印时,它看起来像这样:

$ echo ${newArr[@]}
'1 2 3'
Run Code Online (Sandbox Code Playgroud)

只存储了第一个元素,我不知道如何修复它。

我也试过newArr像这样创建

newArr=( "${!tmp[@]}" )
Run Code Online (Sandbox Code Playgroud)

但更糟糕的是 - 只打印了 0。

$ echo ${newArr[@]}
0
Run Code Online (Sandbox Code Playgroud)

那么,您知道如何使用数组,如果其名称存储在其他变量中吗?

ctx*_*ctx 7

可以使用eval

$ declare -a array=( 1 2 3 4 )
$ echo "${array[@]}"
1 2 3 4
$ p=ay
$ tmp=arr$p
$ echo "$tmp"
array
$ echo "\${${tmp}[@]}"
${array[@]}
$ echo "newarray=(\"\${${tmp}[@]}\")"
newarray=("${array[@]}")
$ eval "newarray=(\"\${${tmp}[@]}\")"
$ echo "${newarray[@]}"
1 2 3 4
$
Run Code Online (Sandbox Code Playgroud)

以 echo 开头的命令是为了说明,eval 是危险的。

请注意,以上不保留稀疏数组的数组索引。