【问题标题】:Concatenate arrays using iteration in name with bash使用名称中的迭代与 bash 连接数组
【发布时间】:2022-01-18 09:19:41
【问题描述】:

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

#!/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[@]} 错误替换

【问题讨论】:

  • using shortest lines 那你为什么要使用这么多空格? to concatenate unlimited numbers 你想输出它们还是将它们存储在一个数组中?请具体。
  • 无限?您真的要创建无限数量的变量吗?
  • 不关心空格,我用的是更好的视图。我想首先将所有元素放在一个数组中,当然我稍后会使用元素,但是我如何使用变量作为数组名称中的数字来进行连接?
  • 只是说数组的数量不受限制,一开始限制在 10 个,但后来我想添加更多,所以它们可能是 100

标签: arrays bash iteration concatenation


【解决方案1】:

您可以使用变量间接:

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

【讨论】:

  • 您需要在${!ref} 周围加上双引号——没有它们,它将受到通常的分词和通配符扩展的混乱。
  • 不工作,我没有错误但是使用 echo 打印时我只有第一个 element1
  • @antonio1:很奇怪,你的例子对我有用。
【解决方案2】:

以下代码将所有 4 个列表串联在一起。

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

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

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

【讨论】:

  • 很抱歉,有些东西不好,最后我得到了一个数组中的所有元素,但它们不再有双重配额,当我尝试使用带有 for 循环的最终数组来获取元素一一被视为所有元素为一。这不好。
  • 我提供的代码没有将元素放入数组中。它输出它们。据我了解,我们的目标是输出 尽可能最短 行。 finally I get all elements in one array 那么您没有使用我在此答案中提供的代码(?)。你真的需要尽可能最短吗?请参阅另一个答案 - 它正确处理引用。用 shellcheck 检查你的脚本
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 2016-06-03
  • 2017-02-12
  • 2013-07-02
  • 1970-01-01
  • 2015-04-13
  • 2018-08-01
相关资源
最近更新 更多