用bash打印数组

时间:2015-04-08 06:06:01

标签: bash

我的bash脚本中有两个数组:

A=('AB' 'CD' 'EF' 'GH' 'IJ' 'KL' 'MN');

B=('1' '2' '3' '4' '5' '6' '7');

我希望能够将数组合并到变量中(例如,在' merge'中),以便执行如下操作:

echo $merge

...会打印

(AB, 1, CD, 2, EF, 3, GH, 4, IJ, 5, KL, 6, MN, 7)

数组的长度/大小不必相等。有关如何做到这一点的任何想法?

谢谢!

3 个答案:

答案 0 :(得分:2)

A=('AB' 'CD' 'EF' 'GH' 'IJ' 'KL' 'MN')
B=('1' '2' '3' '4' '5' '6' '7' '8')
len=${#A[@]}
[[ $len -lt ${#B[@]} ]] && len=${#B[@]}
out=""
for i in $(seq 0 $((len-1)));do
    [[ -n "${A[$i]}" ]] && out=$out","${A[$i]}
    [[ -n "${B[$i]}" ]] && out=$out","${B[$i]}
done
echo ${out:1}

注意:我给出B 8元素,这样如果A和B的长度不相同,只需将较长列表的其余元素放到输出尾部

说明:

3行和4行代码只找出两个list的最大长度。然后使用for循环将每个列表的i非空项放入输出中。最后删除第一个seprator { {1}}。

希望这会对你有所帮助。

答案 1 :(得分:1)

我会接近,但略有不同。选择最短的数组不是找到最长的数组,而是确保每个数组中包含1对1元素的唯一方法:

#!/bin/bash

A=('AB' 'CD' 'EF' 'GH' 'IJ' 'KL' 'MN')
B=('1' '2' '3' '4' '5' '6' '7' '8')
len=${#A[@]}
declare -a combined

[ $len -lt ${#B[@]} ] || len=${#B[@]}  # find shortest array

for ((i = 0; i < $len; i++)); do

    [ -n ${A[i]} ] && combined+=( "${A[i]}" )
    [ -n ${B[i]} ] && combined+=( "${B[i]}" )

done

merge=$(printf " %s," ${combined[@]})
merge=${merge%,}
merge="($merge)"

echo $merge

exit 0

<强>输出

$ bash array_merge.sh
(AB, 1, CD, 2, EF, 3, GH, 4, IJ, 5, KL, 6, MN, 7)

答案 2 :(得分:0)

A=('AB' 'CD' 'EF')
B=('1' '2' '3' '4' '5' '6' '7' '8')
IFS=$'\n' 
m=($(paste -d\\n <(printf %s,\\n "${A[@]}") \
                 <(printf %s,\\n "${B[@]}" | head -c-2)))
merge=\("${m[@]}"\)
echo "$merge"

输出:

(AB, 1, CD, 2, EF, 3, 4, 5, 6, 7, 8)