Shellskripte mit Aha-Effekt: Bash-Arrays
Demo-Adressverwaltung
Jetzt wird es aber Zeit für ein etwas längeres Beispiel. Das folgende Programm stellt eine einfache Adressverwaltung dar, wobei die Namen den Schlüssel bilden und als Wert dann die Adresse im assoziativen Array eingetragen wird. Zur Verwaltung des Arrays stehen zwei einfache Funktionen zur Verfügung. Nach der Deklaration des Arrays »Adresse« als Hash in Zeile 1 wird in den Zeilen 3 bis 7 die Funktion Speichere_Adresse
definiert, die Namen und Adresse als Parameter übernimmt und im Hash ablegt.
Die zweite Funktion, Suche_Adresse
, stellt zunächst fest, ob der Name als Schlüssel gespeichert ist, und gibt daraufhin die Adresse aus (Zeilen 10- 15). Kann der Name nicht gefunden werden, erfolgt eine Fehlermeldung und es wird der Rückgabewert auf 99 gesetzt (Zeilen 16 - 20).
In den Zeilen 22 bis 27 werden die Adressdaten aus der Datei adressen.csv
eingelesen. Dort stehen pro Zeile Name und Adresse getrennt durch ein Semikolon. Diese dient dann auch nach dem Einlesen der Zeile als Trennzeichen für die beiden cut
-Befehle (Zeilen 24 und 25), welche die beiden Felder an Speichere_Adresse
übergeben.
In den Zeilen 29 - 36 werden dann die Adressdaten mittels Suche_Adresse
abgefragt.
01: declare -A Adresse 02: 03: Speichere_Adresse () 04: { 05: Adresse["$1"]="$2" 06: return $? 07: } 08: 09: 10: Suche_Adresse () 11: { 12: if [ ${Adresse[$1]+_} ] 13: then 14: echo "$1's Adresse lautet ${Adresse[$1]}." 15: return $? 16: else 17: echo "$1's Adresse ist nicht vorhanden." 18: return 99 19: fi 20: } 21: 22: # Adressen aus CSV-Datei einlesen 23: while read LINE; do 24: NAME=$(echo $LINE | cut -d';' -f1) 25: ADDR=$(echo $LINE | cut -d';' -f2) 26: Speichere_Adresse "$NAME" "$ADDR" 27: done < adressen.csv 28: 29: # Testaufrufe 30: Suche_Adresse "Donald Duck" 31: Suche_Adresse "Harry Potter" 32: Suche_Adresse "Jules Maigret" 33: Suche_Adresse "Sherlock Holmes" 34: Suche_Adresse "Herman Munster" 35: Suche_Adresse "Thomas A. Edison" 36: Suche_Adresse "John Doe"
Das folgende Listing zeigt die Ausgabe des Programms.
Donald Duck's Adresse lautet Flower Road 13, Duckburg, Callisota. Harry Potter's Adresse lautet Privet Drive 4, Little Whinging, UK. Jules Maigret's Adresse lautet Boulevard Richard-Lenoir 132, Paris, FR. Sherlock Holmes's Adresse lautet Baker Street 221b, London, UK. Herman Munster's Adresse lautet Mockingbird Lane 1313, Mockingbird Heights, USA. Thomas A. Edison's Adresse lautet 37 Christie Street, Menlo Parc, NJ, USA. John Doe's Adresse ist nicht vorhanden.