使用名称中的迭代连接数组 bash

Concatenate arrays using iteration in name with bash

我想使用尽可能短的行连接无限数量的数组,为此我做了以下代码:

#!/bin/bash
declare -a list1=("element1")
declare -a list2=("element2")
declare -a list3=("element3")
declare -a list4=("element4")
declare -a list
for i in {1..4}
do
   list=( ${list[@]} ${list$i[@]} )
done
echo ${list[*]}

但上面的代码不起作用,因为 $i 未被视为变量并且错误是:${list$i[@]} 错误替换

以下代码输出连接在一起的所有 4 个列表。

eval echo ${list{1..4}[*]}

此代码对列表元素的结果运行文件名扩展(* 被文件名替换)。考虑牺牲 4 个字符并执行 \"${list{1..4}[*]}\".

请注意,eval 是邪恶的 https://mywiki.wooledge.org/BashFAQ/048,这样的代码令人困惑。我不会在真实的脚本中编写这样的代码——我肯定会使用循环。使用 shellcheck 检查您的脚本。

您可以使用变量间接寻址:

for i in {1..4} ; do
    ref="list$i[@]"
    list+=("${!ref}")
done
echo "${list[@]}"