[英]delete elements in array bash
我試圖在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個)
好了,花了一分鍾,蘇斯的是,你只是想要做一個終端到中間一次刪除從陣列的兩端工作的兩個元素,同時刪除終端節點,遞增/遞減重復您的計數器,直到到達中間位置。 為什么要以這種方式進行操作有點神秘。 當然,您可以簡單地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")'
您可以在上面看到,在前三個迭代中,兩個末端元素均被刪除。 但是,請注意最后一次刪除(元素最初為且為奇數 ,在最后一次迭代中僅刪除了倒數第二個值)。
查看情況,讓我知道我是否掌握了您的嘗試以及是否還有其他問題。 如果您還有其他意圖,請發表評論,我們很樂意為您提供進一步的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.