unsetentfernt 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 numberskein 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 ahat 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 numbersArray 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 4und 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 numbersmit 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 4hier fehlt in der Liste der Indizes.
Dokumentation
Von man bash:
Das unseteingebaute 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 nameist ein Array oder unset name[subscript], wo subscriptist * oder @, entfernt das gesamte Array.