使用名称中的迭代连接数组 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[@]}"
我想使用尽可能短的行连接无限数量的数组,为此我做了以下代码:
#!/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[@]}"