Объединение двух массивов в Bash

У меня следующая ситуация: два массива, пусть их называют 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

Но это не работает так хорошо, как результат я получаю это:

 0: : : :

В этом случае выход должен быть 0: 1 0: 2 при A = (0) и B = (1 2)

Ответ 1

Так как 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

Выходы:

declare -a c='([0]="0:2" [1]="0:3" [2]="1:2" [3]="1:3")'

Ответ 2

Если вам не нужны дубликаты, вы можете объединить два массива в одну строку:

NEW=("${OLD1[@]}" "${OLD2[@]}")

Полный пример:

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

Кредит: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Ответ 3

здесь одним способом

a=(0 1)
b=(1 2)
for((i=0;i<${#a[@]};i++));
do
    for ((j=0;j<${#b[@]};j++))
    do
        c+=(${a[i]}:${b[j]});
    done
done

for i in ${c[@]}
do
    echo $i
done

Ответ 4

Один оператор строки для объединения двух массивов в bash:

combine=( `echo ${array1[@]}` `echo ${array2[@]}` )