您好我有以下数组:
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时插入一个值
我该怎么做?
非常感谢。
答案 0 :(得分:2)
只需创建一个从最小值到最大值的循环并填补空白:
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 :(得分:1)
您可以使用${arr[@]:index:count}
选择原始数组的部分
选择开始,插入新元素,添加结尾。
在索引i = 5(第五个元素)之后插入元素
$ 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>
答案 2 :(得分: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
分配回原始数组。