使用包含空格的字符串填充 bash 数组,从类似数组中读取条目

使用包含空格的字符串填充 bash 数组,从类似数组中读取条目

我读过几篇文章,讨论如何填充 Bash 数组,其中每个条目都有空格。我相信我已经成功了。

我需要做的是在循环中执行此操作,用每次迭代中所有数组的内容填充更大的数组。

因此,我有一个外循环迭代从另一个脚本获得的数组的条目。在该循环的每次迭代中,我运行一个生成多行输出的命令行,并且我希望每一行都是一个数组条目。我必须将所有这些数组条目添加到“摘要”数组中。由于我不知道如何“将此数组的内容附加到另一个数组”,因此我认为我必须迭代较小的数组。到目前为止,这正在做我需要的事情。但是,对较大数组的追加似乎无法正常工作。在我执行此操作后,附加到较大的数组并检查较大数组的长度,它始终只是“1”。

脚本的相关部分大约是这样的:

nslist=$(...)
pnarray=()
for ns in $nslist; do
    IFS=$'\n' nspnarray=($(...))
    echo "nspnarray.len[${#nspnarray[@]}]" # This looks fine
    for pn in ${nspnarray[@]}; do
        echo "pn[$pn]" # This looks fine
        IFS=$'\n' pnarray+=$pn # Something wrong with this?
        echo "pnarray.len[${#pnarray[@]}]" # is always 1
    done
done

这不是一个完整的脚本,所以我希望这是清楚的。带有“这看起来不错”注释的行打印出了我想要的内容。在我的示例数据中,我在“nspnarray”赋值中调用的命令行生成五行输出,“nspnarray.len”打印语句显示“5”。

然后,我遍历这五个条目中的每一个,打印每一个。这看起来还是不错的。正如预期的那样,它打印了一个包含空格的值。然后我尝试将其分配给我的“摘要”数组,然后打印摘要数组的长度,它始终打印“1”。我认为我在“这有什么问题吗?”的作业中做错了什么?线。

答案1

将一个数组添加到另一个数组非常简单:

$ a=(1 2 3)
$ b=(4 5 6)
$ a+=("${b[@]}")
$ typeset -p a
declare -a a=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6")

但是,如果您正在使用数组执行相对复杂的操作,那么您确实应该使用更适合该任务的语言。 awk或者perl,例如。或者python。或者除了 bash 或其他 shell 之外的几乎任何东西。

shell 非常适合编排其他程序的执行(以及其他程序的管道,以及 stdin 和 stdout 的重定向等)来执行操作或处理数据。它本身并不擅长完成这些其他任务——事实上,它很糟糕。

awk具有多维数组(索引和关联),perl也具有数据结构,其中数组或哈希可以包含其他数组和/或哈希,嵌套任意深度。大多数其他语言也具有复杂的数据结构。

而且,同样重要的是,它们不存在 shell 所存在的引用或分词问题。

相关内容