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
.