unset
rimuove un elemento. Non rinumera gli elementi rimanenti.
Possiamo usare declare -p
per 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 numbers
non 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 a
non 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' numbers
array 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 4
e 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 numbers
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")
Per vedere quali indici sono assegnati:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Ancora una volta, 4
manca dall'elenco degli indici.
Documentazione
Da man bash
:
L' unset
integrato 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 name
trova un array o unset name[subscript]
, dove si subscript
trova *
o @
, rimuove l'intero array.