unset
usuwa element. Nie przenumerowuje pozostałych elementów.
Możemy użyć, declare -p
aby zobaczyć dokładnie, co się dzieje z 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")
Zauważ, że numbers
nie ma już elementu 4
.
Inny przykład
Przestrzegać:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
Tablica a
nie ma elementów od 2 do 21. Bash nie wymaga, aby indeksy tablic były następujące po sobie.
Sugerowana metoda wymuszenia numeracji indeksów
Zacznijmy od numbers
tablicy z brakującym elementem 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Jeśli chcielibyśmy zmienić wskaźniki, to:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Jest teraz numer elementu 4
i ma on wartość 69
.
Alternatywna metoda usuwania elementu i zmiany numeracji tablicy w jednym kroku
Ponownie zdefiniujmy numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Jak zasugerował Toby Speight w komentarzach, metoda usunięcia czwartego elementu i zmiany numeracji pozostałych elementów w jednym kroku:
$ 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")
Jak widać, czwarty element został usunięty, a wszystkie pozostałe elementy zostały ponumerowane.
${numbers[@]:0:4}
tablica plasterków numbers
: pobiera pierwsze cztery elementy, zaczynając od elementu 0.
Podobnie, ${numbers[@]:5}
pokrój tablicę numbers
: bierze wszystkie elementy, zaczynając od elementu 5 i kontynuując do końca tablicy.
Uzyskiwanie wskaźników tablicy
Te wartości tablicy można uzyskać ${a[@]}
. Aby znaleźć indeksy (lub klucze ) odpowiadające tym wartościom, użyj ${!a[@]}
.
Na przykład rozważmy jeszcze raz naszą tablicę numbers
z brakującym elementem 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Aby zobaczyć, które indeksy są przypisane:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Znowu 4
brakuje jej na liście indeksów.
Dokumentacja
Od man bash
:
unset
Wbudowane służy do niszczenia tablic. unset name[subscript]
niszczy element tablicy o indeksie subscript
. Ujemne indeksy dolne do indeksowanych tablic są interpretowane jak opisano powyżej. Należy zachować ostrożność, aby uniknąć niepożądanych efektów ubocznych spowodowanych rozszerzaniem nazwy ścieżki. unset name
, gdzie name
jest tablica lub unset name[subscript]
, gdzie subscript
jest *
lub @
, usuwa całą tablicę.