Shellskripte mit Aha-Effekt: Bash-Arrays
Lösch- und Umwandlungsoperationen
Um ein assoziatives Array zu löschen, genügt es nicht, das Array neu zu deklarieren. Diese Re-Deklaration bewirkt eigentlich gar nichts, das folgende Programm gibt zweimal »bar« aus:
01: declare -A ARRAY 02: ARRAY[foo]=bar 03: echo ${ARRAY[foo]} 04: 05: declare -A ARRAY 06: echo ${ARRAY[foo]}
Sie müssen vielmehr das assoziative Array mittels unset
gänzlich aus dem Gedächtnis der Bash entfernen und dann natürlich neu deklarieren. Beim Programm kommt so die Zeile 5 hinzu:
01: declare -A ARRAY 02: ARRAY[foo]=bar 03: echo ${ARRAY[foo]} 04: 05: unset ARRAY 06: declare -A ARRAY 07: echo ${ARRAY[foo]}
Meist will man jedoch nicht das ganze Array, sondern nur einzelne Einträge löschen. Dies erfolgt fast auf die gleiche Art und Weise wie oben, jedoch mit dem Unterschied, dass bei unset
der Schlüssel des zu löschenden Eintrags angegeben wird. Beim folgenden Programm wird in Zeile 11 der Eintrag »zwei« gelöscht:
01: declare -A ARRAY 02: ARRAY=([eins]=one 03: [zwei]=two 04: [drei]=three) 05: 06: echo ${ARRAY[eins]} 07: echo ${ARRAY[zwei]} 08: echo ${ARRAY[drei]} 09: echo "" 10: 11: unset ARRAY[zwei] 12: echo ${ARRAY[eins]} 13: echo ${ARRAY[zwei]} 14: echo ${ARRAY[drei]}
Enthält der Schlüssel Leerzeichen oder andere Sonderzeichen, muss er in Gänsefüßchen oder Apostrophe eingeschlossen werden, was auch gilt, wenn der Schlüssel als Variable übergeben wird, z.B.:
unset ["Donald Duck"] # Gaensefuesschen unset ['Donald Duck'] # Apostroph unset ["$Key"] # Variable
Man kann sogar ein assoziatives Array in ein indiziertes Array konvertieren - wenn auch mit unvorhersagbarem Ergebnis, was die Reihenfolge betrifft. Im folgenden Beispiel wird ein assoziatives Array deklariert, gefüllt und ausgegeben (Zeilen 1 bis 9). In Zeile 11 erzeugt die Zuweisung aus ARRAY
ein indiziertes Array KEYS
. Beachten Sie bitte die runden Klammern, die den Effekt bewirken.
01: declare -A ARRAY 02: ARRAY=(["eins"]="one" 03: ["zwei"]="two" 04: ["drei"]="three") 05: 06: echo "Ausgabe ARRAY" 07: for K in ${!ARRAY[@]}; do 08: echo "$K --> ${ARRAY[$K]}" 09: done 10: 11: KEYS=( ${!ARRAY[@]} ) 12: 13: echo "" 14: echo "Ausgabe KEYS" 15: for K in 0 1 2; do 16: echo "$K --> ${KEYS[$K]}" 17: done
Die Ausgabe des indizierten Arrays in den Zeilen 14 bis 17 zeigt, dass die Reihenfolge der Speicherung im Hash wieder mal nicht der Eingabereihenfolge entsprach und daher das indizierte Array vielleicht nicht ganz den Vorstellungen des Programmierers entspricht.
Ausgabe ARRAY zwei --> two eins --> one drei --> three Ausgabe KEYS 0 --> zwei 1 --> eins 2 --> drei