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更多)
答案 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次迭代中,两个终结元素都被删除了。但是,请注意最后一次删除(原来是和奇数的元素,在最后一次迭代时只删除单个最后一个值。
仔细看看,让我知道你是否记录了你的尝试以及是否还有其他问题。如果您的意图是别的,请发表评论,我很乐意进一步提供帮助。