Eine Sache, die zu beachten ist, ist, dass bash
implementierte Arrays wie ksh
assoziative Arrays, bei denen Schlüssel auf positive ganze Zahlen beschränkt sind (im Gegensatz zu anderen Sprachen wie perl
oder zsh
zum Beispiel).
Im:
a[123]=foo a[456]=bar a[789]=baz
In bash haben Sie ein assoziatives Array mit 3 Elementen, während Sie in bash perl
ein Array mit 790 Elementen haben (789 mit zsh).
In ksh
oder bash
, ${a[@]:0:1}
gibt das erste Element des Feldes in der Liste von Elementen sortierte numerisch durch Schlüssel , wo der Schlüssel ist größer oder gleich 0 , so dass in diesem Fall, gibt sie ${a[123]}
nicht ${a[0]}
.
unset 'a[123]'
(Denken Sie daran, es zu zitieren, da es sonst fehlschlagen würde, wenn sich im aktuellen Verzeichnis eine Datei mit den Namen a1 oder a2 oder a3 befindet.) Dies ist sinnvoll, da ein bestimmter Schlüssel im Array entfernt wird.
unset 'a[@]::2'
macht aber weniger Sinn. bash
nur versteht unset a
, unset 'a[123]'
oder unset 'a[*/@]'
, etwas nach ignoriert wird, so unset 'a[@]::2'
und unset 'a[@]please'
das gleiche tun: unset das gesamte Array.
Wenn Sie einen Tastenbereich deaktivieren möchten, müssen Sie die Tasten durchlaufen:
Um die Liste der Schlüssel des Arrays zu erhalten, lautet die Syntax "${!a[@]}"
. Leider funktioniert das Anwenden eines Bereichs nicht mit bash
noch ksh
, sodass Sie ein temporäres Array benötigen:
keys=("${!a[@]}")
for i in "${keys[@]::2}"; do unset "a[$i]"; done
Wenn Sie diese Arrays nun wie in anderen Sprachen betrachten möchten, möchten Sie sie nicht verwenden unset
. Wenn das Array an erster Stelle nicht dünn ist und Sie es beibehalten möchten (dh alle Elemente um 2 verschieben, anstatt die ersten beiden zu deaktivieren), können Sie Folgendes tun:
a=("${a[@]:2}")
Das heißt, Sie ordnen das Array mit der Liste der Elemente neu zu, die Sie behalten möchten.
Zum Vergleich mit zsh
.
a=({1..20})
unset 'a[12,16]'
würde einen leeren Wert auf die Elemente 12 bis 16 setzen, während unset 'a[16,20]'
das Array auf 15 Elemente verkleinert würde.
a=({1..20})
a[12,16]=()
(noch mit zsh
) würde die Elemente 17 bis 20 um 5 Positionen verschieben, also a[12]
enthalten 17
.
Wenn Ihr Array kontinuierlich / nicht dünn ist (alle Elemente von 0..N-1 gesetzt)
Sie können das 2. Element des Arrays mit entfernen
Um das 2., 3. und 4. Element zu entfernen, können Sie z
Um alle Elemente außer dem 1. und 2. Element zu löschen, können Sie z
Allgemeine Lösung (funktioniert auch für dünn besetzte Arrays): Sie können das 2. Element des Arrays mit entfernen
Um das 2., 3. und 4. Element zu entfernen, können Sie z
Um alle Elemente außer dem 1. und 2. Element zu löschen, können Sie z
quelle
unset a[@]::2
${#a[@]}
die Anzahl der Elemente im Array nicht der größte Index im Array ist (bash
Arrays sind wieksh
Arrays im Gegensatz zu zsh spärlich).a=( $(echo ${a[@]}) )
das in Ordnung?a=("${a[@]}")
Verwendungecho
und Befehlsersetzung funktioniert nur in begrenzten Eckfällen (z. B. wenn keines der Elemente leer ist oder spc, tab, NL, backslash, *,?, Enthält [oder beginnen mit -).