Ein weiteres Skript (Listing 15) demonstriert, wie Sie einen Wert, der in einer Datei (im Beispiel lang.conf) hinterlegt ist, wieder auslesen und nutzen. Die möglichen Werte lauten de für die deutsche und en für die englische Sprache. Das Skript liest diese Datei beim Programmstart aus, erstellt das Menü mit drei Punkten: je einem zum Einstellen der Sprache und einem zum Beenden. Die Texte für das Menü liegen in deutscher und in englischer Sprache vor, die Auswahl innerhalb der Menüpunkte gelingt mit Klein- wie Großbuchstaben.
Listing 15
#!/bin/bash
# Auslesen Spracheinstellungen
sprache=$(cat lang.conf)
# Menütext anzeigen, Aufgabe abfragen
while true; do
if [ "$sprache" = "de" ]; then
clear
echo -e "(a) Punkt 1\n(b) Punkt 2\n(c) Punkt 3\n(s) Spracheinstellungen\n(e) Ende"
read -n1 -p "Aufgabe: " aufg
elif [ "$sprache" = "en" ]; then
clear
echo -e "(a) first\n(b) second\n(c) third\n(l) Language\n(q) Quit"
read -n1 -p "Task: " aufg
else
echo "Fehler in der Spracheinstellung"
exit
fi
case "$aufg" in
[aA])
echo "1"; sleep 5; ;;
[bB])
echo "2"; sleep 5; ;;
[cC])
echo "3"; sleep 5; ;;
[sS]|[lL])
while true; do
clear
echo "(1) Deutsch"
echo "(2) English"
read -n1 -p "Sprache/Language: " ehcarps
if [ "$ehcarps" = "1" ]; then
sprache="de"
echo $sprache > lang.conf
break
elif [ "$ehcarps" = "2" ]; then
sprache="en"
echo $sprache > lang.conf
break
fi
done ;;
[eE]|[qQ])
exit ;;
esac
done
Das Einstellen der Sprache erfolgt durch das Auslesen der Konfiguration und das Belegen der Variable sprache. Deren Wert ändern Sie in den Zeilen 35 oder 39. Den neuen Inhalt von lang.conf schreiben Sie in den Zeilen 36 beziehungsweise 40. Das break danach beendet das Menü.
Mehrsprachige Eingaben erfordern den Einsatz eines Case-Konstrukts. Damit bleibt das Skript kompakt und gut zu verstehen. In der Praxis würden Sie die Texte für die Menüs nicht unbedingt in den Shell-Code aufnehmen, sondern aus einer Datei einlesen.
TIPP
Vermeiden Sie einen häufigen Fehler: Anweisungen im Case-Konstrukt erfordern ein doppeltes Semikolon (;;) am Ende.
Funktionen definieren
Funktionen nehmen generische Code-Teile auf, die Sie immer wieder verwenden. Sie bringen sie direkt am Anfang des Skripts unter. Bei der Wahl des Namens für die Funktion haben Sie weitgehend freie Hand. Vermeiden Sie jedoch Namen, die schon als Programm, Skript oder Variable im Einsatz sind – das führt in der Praxis nur zu Verwirrung.
Wählen Sie trotzdem einen bereits als Befehl verwendeten Namen für eine Funktion, gilt es, die Reihenfolge zu bedenken, in der die Shell diesen Namen aufruft: Zuerst sucht sie nach einer Funktion, dann nach einem eingebauten Befehl der Shell und zuletzt nach einem externen Tool.
Den Exit-Code einer Funktion dürfen Sie selbst definieren. Planen Sie, dass das Skript weiterarbeitet, erreichen Sie das mittels return Exit-Code. Soll das Skript hingegen komplett abbrechen, etwa weil die Quelle an Argumenten erschöpft ist, verwenden Sie exit Exit-Code.
Eine Funktion besteht aus dem einleitenden Namen, einer folgenden leeren Klammer () und dem Körper der Funktion, den Sie mit geschweiften Klammern umschließen (Listing 16, erste Definition). Die leere Klammer entfällt, wenn Sie die Funktion mit dem Schlüsselwort function einleiten – das gilt aber nur für die Bash (Listing 16, zweite Definition).
Listing 16
#!/bin/bash
# Funktionsdefinition
hallo () {
echo "Hallo"
return 0
}
# alternative Funktionsdefinition
function hallo2 {
echo "Hallo Hallo"
return 0
}
# Aufruf der Funktionen
hallo
hallo2
Benötigen Sie eine Funktion im laufenden Skript nicht mehr, etwa, weil es nicht mehr sinnvoll ist, sie aufzurufen, so verfahren Sie mit ihr wie mit einer zu überflüssigen Variablen und löschen sie mit unset Funktion.
Global vs. lokal
In der Bash definieren Sie Variablen global (für das gesamte Skript) oder lokal (nur für innerhalb der Funktion). Für Letzteres setzen Sie das Schlüsselwort local vor die Definition der Variablen (Listing 17).
Listing 17
#!/bin/bash
# Variablendefinition
a="Wert1"
b="Wert2"
echo "Ausgangsdefinition:"
echo " " $a
echo " " $b
echo " "
function hallo {
a="Neuer Wert a"
local b="Neuer Wert b"
echo "In der Funktion:"
echo " " $a
echo " " $b
echo " "
return 0
}
hallo
echo "Nach Funktionsausführung:"
echo " " $a
echo " " $b
echo " "
Fazit
Mithilfe von Fallunterscheidungen programmieren Sie schnell und einfach Menüs für Ihre Software. Welches Konstrukt dabei das optimale ist, unterscheidet in der Regel den konkreten Anwendungsfall.





