unset
entfernt ein Element. Die verbleibenden Elemente werden nicht neu nummeriert.
Wir können verwenden declare -p
, um genau zu sehen, was passiert mit 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")
Beachten Sie, dass das numbers
kein Element mehr hat 4
.
Ein anderes Beispiel
Beobachten:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
Array a
hat keine Elemente 2 bis 21. Bash erfordert nicht, dass Array-Indizes aufeinanderfolgend sind.
Vorgeschlagene Methode, um eine Umnummerierung der Indizes zu erzwingen
Beginnen wir mit dem numbers
Array mit dem fehlenden Element 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Wenn wir möchten, dass sich die Indizes ändern, dann:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Es gibt jetzt eine Elementnummer 4
und sie hat einen Wert 69
.
Alternative Methode zum Entfernen eines Elements und zum Umnummerieren des Arrays in einem Schritt
Lassen Sie uns noch einmal definieren numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Wie von Toby Speight in den Kommentaren vorgeschlagen, eine Methode zum Entfernen des vierten Elements und zum Umnummerieren der verbleibenden Elemente in einem Schritt:
$ 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")
Wie Sie sehen können, wurde das vierte Element entfernt und alle verbleibenden Elemente wurden neu nummeriert.
${numbers[@]:0:4}
Slices-Array numbers
: Es werden die ersten vier Elemente beginnend mit Element 0 verwendet.
In ähnlicher Weise ${numbers[@]:5}
Slice-Array numbers
: Es werden alle Elemente verwendet, die mit Element 5 beginnen und bis zum Ende des Arrays reichen.
Abrufen der Indizes eines Arrays
Die Werte eines Arrays können mit erhalten werden ${a[@]}
. Verwenden Sie, um die Indizes (oder Schlüssel ) zu finden, die diesen Werten entsprechen ${!a[@]}
.
Betrachten Sie zum Beispiel noch einmal unser Array numbers
mit dem fehlenden Element 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
So sehen Sie, welche Indizes zugewiesen sind:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Auch 4
hier fehlt in der Liste der Indizes.
Dokumentation
Von man bash
:
Das unset
eingebaute wird verwendet, um Arrays zu zerstören. unset name[subscript]
zerstört das Array-Element am Index subscript
. Negative Indizes für indizierte Arrays werden wie oben beschrieben interpretiert. Es muss darauf geachtet werden, unerwünschte Nebenwirkungen durch die Erweiterung des Pfadnamens zu vermeiden. unset name
, wo name
ist ein Array oder unset name[subscript]
, wo subscript
ist *
oder @
, entfernt das gesamte Array.