删除数组bash中的元素

时间:2017-10-21 04:29:50

标签: arrays bash algorithm

我试图在bash脚本中的数组中同时删除两个元素 我的代码是

elegidos = (1 2 3 4 5 6 7)
i=0
j=${#elegidos[@]}
delete=($i $j)
while [ $i -le $j ]; do
        #elegidosmenosdos=${elegidos[@]/$i:$j}
        echo ${elegidos[@]/$delete}
        delete=($i $j)
        let "i++"
        let "j--"

done

我的输出是

1 2 3 4 5 6 7

1 2 3 4 5 6 7

2 3 4 5 6 7

1 3 4 5 6 7

我需要21个不同的组合,五个元素使用七个数字 输出示例

1 2 3 4 5

2 3 4 5 6

7 6 5 4 3 。 。 。 。 。(21更多)

1 个答案:

答案 0 :(得分:0)

好吧,花了一分钟时间来说你只是想在数组末端一次删除两个元素的 end-to-middle 删除,删除同时结束节点,递增/递减计数器并重复直到达到中间位置。你为什么这么想这样做有点神秘。当然,您可以简单地unset elegidos并立即取消设置所有值。但是,如果你想从两端工作 - 如果你有目的的话也很好。

您的脚本中有几个问题。在bash中,所有数组都零索引。您的数组有7个元素,因此有效索引为0-6。因此,您j开头是错误的。您需要从元素数中减去1以获取结束元素的索引,例如

i=0
j=$((${#elegidos[@]} - 1))

bash提供了一个C风格的循环,可以大大简化您的任务。虽然您可以自由使用while C样式循环,但可以无缝地处理索引增量和减量,例如

for ((; i <= j; i++, j--)); do

注意 i <= j。如果数组中有奇数个元素,那么在最后一次迭代中,您只需删除一个值而不是两个。要处理这种情况,您需要在循环中进行简单测试,以检查[ "$i" = "$j" ](或使用算术比较(( i == j )))。

完全相反,您可以优化元素移除以一次将数组两个元素清空为类似于以下内容:

#!/bin/bash

elegidos=(1 2 3 4 5 6 7)
i=0
j=$((${#elegidos[@]} - 1))
delete=($i $j)

for ((; i <= j; i++, j--)); do
    declare -p elegidos
    unset elegidos[$i]
    [ "$i" != "$j" ] && unset elegidos[$j]
    delete=($i $j)
done

示例使用/输出

$ bash array_del.sh
declare -a elegidos='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6" [6]="7")'
declare -a elegidos='([1]="2" [2]="3" [3]="4" [4]="5" [5]="6")'
declare -a elegidos='([2]="3" [3]="4" [4]="5")'
declare -a elegidos='([3]="4")'

您可以在上面看到,在前3次迭代中,两个终结元素都被删除了。但是,请注意最后一次删除(原来是和奇数的元素,在最后一次迭代时只删除单个最后一个值。

仔细看看,让我知道你是否记录了你的尝试以及是否还有其他问题。如果您的意图是别的,请发表评论,我很乐意进一步提供帮助。