在Bash中合并两个数组

f10*_*bit 23 arrays bash shell loops

我有以下情况,两个数组,让我们称它们为A(0 1)和B(1 2),我需要将它们组合成一个新的数组C(0:1 0:2 1:1 1:2),我想出的最新一点是这个循环:

   for ((z = 0; z <= ${#A[@]}; z++)); do
     for ((y = 0; y <= ${#B[@]}; y++)); do
       C[$y + $z]="${A[$z]}:"
       C[$y + $z + 1]="${B[$y]}"
     done
   done
Run Code Online (Sandbox Code Playgroud)

但它不能很好地工作,因为输出我得到这个:

 0: : : :
Run Code Online (Sandbox Code Playgroud)

在这种情况下,输出应为0:1 0:2,因为A =(0)且B =(1 2)

Ian*_*unn 75

如果您不关心重复项,可以将两个数组连接在一行中:

NEW=("${OLD1[@]}" "${OLD2[@]}")
Run Code Online (Sandbox Code Playgroud)

完整示例:

Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');
UnixShell=("${Unix[@]}" "${Shell[@]}")
echo ${UnixShell[@]}
echo ${#UnixShell[@]}
Run Code Online (Sandbox Code Playgroud)

图片来源:http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

  • @DennisWilliamson,是的,但谷歌将派遣数千人在这里寻找这个答案.我很高兴它在这里. (14认同)
  • 这连接了两个不是OP想要的数组. (4认同)
  • 虽然这是一种有用的技术,但还应该注意源数组的索引丢失了。创建目标数组时,会生成新索引。 (2认同)
  • @Dave F,缺少的“-n”不是数组连接的问题。这按预期工作。它丢失了,因为 `echo` 将其解释为不输出换行符的选项。 (2认同)

Pau*_*ce. 12

由于Bash支持稀疏数组,因此迭代数组比使用基于大小的索引更好.

a=(0 1); b=(2 3)
i=0
for z in ${a[@]}
do
    for y in ${b[@]}
    do
        c[i++]="$z:$y"
    done
done
declare -p c   # dump the array
Run Code Online (Sandbox Code Playgroud)

输出:

declare -a c='([0]="0:2" [1]="0:3" [2]="1:2" [3]="1:3")'
Run Code Online (Sandbox Code Playgroud)