如何在数组中间添加一个值?

4

你好,我有以下数组:

array=(1 2 3 4 5 7 8 9 12 13)

我执行了这个for循环:

    for w in ${!array[@]}
    do
        comp=$(echo "${array[w+1]} - ${array[w]} " | bc)
        if [ $comp = 1 ]; then
            /*???*/
        else
            /*???*/
        fi
    done

我想要做的是在两个连续元素之间的差不等于1时插入一个值。
我该怎么做呢?
非常感谢。

1
那么最终的数组会是什么样子?所有缺失的值都应该被填充吗? - Tom Fenech
最终数组应该是 array = (1 2 3 4 5 0 7 8 9 0 0 12 13)。 - Andrea
3个回答

3
只需从最小值到最大值创建一个循环,并填充空缺即可:
array=(1 2 3 4 5 7 8 9 12 13)
min=${array[0]}
max=${array[-1]}

new_array=()
for ((i=min; i<=max; i++)); do
    if [[ " ${array[@]} " =~ " $i " ]]; then
        new_array+=($i)
    else
        new_array+=(0)
    fi
done

echo "${new_array[@]}"

这将创建一个新的数组$new_array,其值为:
1 2 3 4 5 0 7 8 9 0 0 12 13

这里使用了检查数组是否包含某个值的技巧


1
非常感谢,这正是我正在寻找的。 - Andrea

3
你可以使用 ${arr[@]:index:count} 选择原始数组的部分内容。
选择开始位置,插入新元素,再添加结束位置即可。
要在第五个元素后插入一个新元素,请执行以下操作:
 $ array=(1 2 3 4 5 7 8 9 12 13)
 $ i=5
 $ arr=("${array[@]:0:i}")         ### take the start of the array.
 $ arr+=( 0 )                      ### add a new value ( may use $((i+1)) )
 $ arr+=("${array[@]:i}")          ### copy the tail of the array.
 $ array=("${arr[@]}")             ### transfer the corrected array.
 $ printf '<%s>' "${array[@]}"; echo
 <1><2><3><4><5><6><7><8><9><12><13>

为了处理所有元素,只需进行循环:

 #!/bin/bash

array=(1 2 3 4 5 7 8 9 12 13)

for (( i=1;i<${#array[@]};i++)); do

    if    (( array[i] != i+1 ));
    then  arr=("${array[@]:0:i}")           ### take the start of the array.
          arr+=( "0" )                      ### add a new value
          arr+=("${array[@]:i}")            ### copy the tail of the array.
          # echo "head $i ${array[@]:0:i}"  ### see the array.
          # echo "tail $i ${array[@]:i}"
          array=("${arr[@]}")               ### transfer the corrected array.
    fi
done
printf '<%s>' "${array[@]}"; echo

$ chmod u+x ./script.sh
$ ./script.sh
<1><2><3><4><5><0><7><8><9><10><0><0><13>

0

似乎没有直接向数组中插入元素的方法。不过,您可以将元素附加到另一个数组中:

result=()
for w in ${!array[@]}; do
    result+=("${array[w]}")
    comp=$(echo "${array[w+1]} - ${array[w]} " | bc)
    if [ $comp = 1 ]; then
        /* probably leave empty */
    else
        /* handle missing digits */
    fi
done

作为最后一步,您可以将 result 分配回原始数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接