如何在Bash中以拉链方式合并两个数组?

AlM*_*hdi 9 arrays bash zsh

我试图将两个数组合并为一个像拉链一样的时尚.我很难做到这一点.

array1=(one three five seven)
array2=(two four six eight)
Run Code Online (Sandbox Code Playgroud)

我尝试过使用嵌套的for循环,但无法弄明白.我不希望输出为13572468但是12345678.

我正在处理的实际脚本在这里(http://ix.io/iZR)..但它显然没有按预期工作.我要么打印整个array2(例如124683),要么就像第一个索引一样,如果循环不起作用(例如12325272).

那么如何获得输出:

one two three four five six seven eight
Run Code Online (Sandbox Code Playgroud)

上面两个数组?

编辑:我能用两个for循环和paste(http://ix.io/iZU)解决它.看看有人有更好的解决方案仍然会很有趣.所以,如果你有时间,请看看.

小智 7

假设两个阵列大小相同,

unset result
for (( i=0; i<${#array1[*]}; ++i)); do result+=( ${array1[$i]} ${array2[$i]} ); done
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此方法假定索引从零到数组的长度(减一)。由于 Bash 支持稀疏数组,所以这行不通。此外,它不适合关联数组。要迭代索引,请使用 `for index in ${!array1[@]}`。另外,你应该习惯使用 `[@]` 而不是 `[*]`。后者,如果引用的话,将数组变成一个字符串,由 `$IFS` 的第一个字符分隔。比较`(IFS=XYZ; a=("red ball" "blue sky" "green草"); for e in "${a[@]}"; do echo "$((i++)) $e"; done)` 与星号相同,而不是 at 符号。 (3认同)

Mic*_*ott 5

我发现更常见的情况是我想将两个数组压缩成两列。这不像“RTLinuxSW”答案那样原生 Zsh,但对于这种情况,我使用粘贴。

% tabs 16
% paste <(print -l $array1) <(print -l $array2)
one     two
three   four
five    six
seven   eight
Run Code Online (Sandbox Code Playgroud)

然后可以将其推入另一个数组以获得预期的输出:

% array3=( `!!`«tab»«tab» )
% print $array3
one two three four five six seven eight
Run Code Online (Sandbox Code Playgroud)