unsetrimuove un elemento. Non rinumera gli elementi rimanenti.
Possiamo usare declare -pper vedere esattamente cosa succede a numbers:
$ unset "numbers[i]"
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Osserva che numbersnon ha più un elemento 4.
Un altro esempio
Osservare:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
La matrice anon ha elementi da 2 a 21. Bash non richiede che gli indici della matrice siano consecutivi.
Metodo suggerito per forzare una rinumerazione degli indici
Cominciamo con l' numbersarray con l'elemento mancante 4:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Se desideriamo che gli indici cambino, allora:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Ora c'è un numero di elemento 4e ha valore 69.
Metodo alternativo per rimuovere un elemento e rinumerare l'array in un solo passaggio
Ancora una volta, definiamo numbers:
$ numbers=(53 8 12 9 784 69 8 7 1)
Come suggerito da Toby Speight nei commenti, un metodo per rimuovere il quarto elemento e rinumerare gli elementi rimanenti in un solo passaggio:
$ numbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Come puoi vedere, il quarto elemento è stato rimosso e tutti gli elementi rimanenti sono stati rinumerati.
${numbers[@]:0:4}array di sezioni numbers: prende i primi quattro elementi a partire dall'elemento 0.
Allo stesso modo, ${numbers[@]:5}slice array numbers: prende tutti gli elementi che iniziano con l'elemento 5 e continuano fino alla fine dell'array.
Ottenere gli indici di una matrice
I valori di un array possono essere ottenuti con ${a[@]}. Per trovare gli indici (o le chiavi ) che corrispondono a tali valori, utilizzare ${!a[@]}.
Ad esempio, considera di nuovo il nostro array numberscon l'elemento mancante 4:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Per vedere quali indici sono assegnati:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Ancora una volta, 4manca dall'elenco degli indici.
Documentazione
Da man bash:
L' unsetintegrato viene utilizzato per distruggere le matrici. unset name[subscript]distrugge l'elemento dell'array all'indice subscript. I pedici negativi verso array indicizzati vengono interpretati come descritto sopra. Bisogna fare attenzione per evitare effetti collaterali indesiderati causati dall'espansione del percorso. unset name, dove si nametrova un array o unset name[subscript], dove si subscripttrova * o @, rimuove l'intero array.