Login
Login-Name Passwort


 
Newsletter
Werbung

Do, 7. Dezember 2017, 15:00

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

Pro-Linux
Traut euch!
Neue Nachrichten
Werbung