5.7 Menüs mit select (Bash und Korn-Shell only)
Die Bash und die Korn-Shell stellen Ihnen mit der select-Anweisung ein bequemes Konstrukt zum Erzeugen von Auswahlmenüs zur Verfügung. Der Befehl funktioniert ähnlich wie die for-Schleife, nur dass hierbei statt des Schlüsselworts for eben select steht.
select variable in menü_punkte
do
kommando1
...
kommandon
done
select führt dabei die Anzeige der Menüpunkte und deren Auswahl automatisch durch und gibt den ausgewählten Menüpunkt zurück. Hierbei können Sie die Menüpunkte wie bei for entweder in einer Liste mit Werten oder direkt die einzelnen Menüpunkte angeben. Werte und Menüpunkte sollten dabei jeweils durch mindestens ein Leerzeichen getrennt aufgeführt werden (bei Werten: abhängig von IFS). Selbstverständlich können Sie auch die Argumente aus der Kommandozeile ($*) verwenden, sofern dies sinnvoll ist. Nach dem Aufruf von select wird eine Liste der Menüpunkte auf die Standardfehlerausgabe (!) in einer fortlaufenden Nummerierung (1 bis n) ausgegeben. Dann können Sie die Auswahl anhand dieser Nummerierung bestimmen. Der entsprechend ausgewählte Menüpunkt wird dann in »variable« gespeichert. Falls Sie die benötigte Nummer ebenfalls erhalten möchten, finden Sie diese in der Variablen REPLY. Bei einer falschen Eingabe wird »variable« auf leer gesetzt.
Wenn nach der Auswahl entsprechende Kommandos zwischen do und done ausgeführt wurden, wird die Eingabeaufforderung der select-Anweisung erneut angezeigt. Bei select handelt es sich somit um eine Endlosschleife, die Sie nur mit der Tastenkombination (Strg)+(D) (EOF) oder den Befehlen exit bzw. break innerhalb von do und done beenden können (siehe Abbildung 5.2).
Hierzu ein einfaches Script:
# Demonstriert die select-Anweisung
# aselect1
select auswahl in Punkt1 Punkt2 Punkt3 Punkt4
do
echo "Ihre Auswahl war : $auswahl"
done
Das Script bei der Ausführung:
you@host > ./aselect1
1) Punkt1
2) Punkt2
3) Punkt3
4) Punkt4
#? 1
Ihre Auswahl war : Punkt1
#? 2
Ihre Auswahl war : Punkt2
#? 3
Ihre Auswahl war : Punkt3
#? 4
Ihre Auswahl war : Punkt4
#? 0
Ihre Auswahl war :
#? (Strg)+(D)
you@host >
Als Prompt wird hier immer der Inhalt der Variablen PS3 angezeigt, der bei den Shells meistens mit #? vorbelegt ist. Wollen Sie ein anderes Prompt nutzen, müssen Sie diese Variable nur neu besetzen.
Natürlich eignet sich das Script »aselect1« nur zu Demonstrationszwecken. Bei einer echten Menü-Auswahl will man schließlich die Auswahl auch auswerten und entsprechend reagieren. Was eignet sich besser als eine case-Anweisung?
# Demonstriert die select-Anweisung
# aselect2
# Ein neues Auswahl-Prompt
PS3="Ihre Wahl : "
select auswahl in Punkt1 Punkt2 Punkt3 Punkt4 Ende
do
case "$auswahl" in
Ende) echo "Ende"; break ;;
"") echo "Ungültige Auswahl" ;;
*) echo "Sie haben $auswahl gewählt"
esac
done
Das Script bei der Ausführung:
you@host > ./aselect2
1) Punkt1
2) Punkt2
3) Punkt3
4) Punkt4
5) Ende
Ihre Wahl : 1
Sie haben Punkt1 gewählt
Ihre Wahl : 4
Sie haben Punkt4 gewählt
Ihre Wahl : 5
Ende
Mit select können Sie außerdem wie bei der for-Schleife auch die Liste der Menüpunkte mit den Wildcard-Zeichen *, ? und [] (Datennamengenerierung) oder mit einer Kommando-Substitution erzeugen lassen. Hier einige Beispiele:
# Listet alle Dateien mit der Endung *.c auf
select var in *.c
# Listet alle Dateien mit der Endung *.c, *.sh und *.txt auf
select var in *.c *.sh *.txt
# Listet alle aktiven User-Namen auf
select var in `who | cut -c1–8 | grep -v $LOGNAME`
# Listet alle Dateien im aktuellen Verzeichnis auf,
# die mit a beginnen
select var in `ls a*`
Hierzu noch ein relativ praktisches Beispiel. Mithilfe des Wildcard-Zeichens * werden alle sich im aktuellen Verzeichnis befindlichen Dateien ausgegeben. Anschließend werden Sie nach einer Datei gefragt, die Sie editieren wollen, welche daraufhin mit einem Editor Ihrer Wahl (hier vi) geöffnet wird und die Sie dann bearbeiten können. Dieses Script ist natürlich stark ausbaufähig:
# Demonstriert die select-Anweisung
# aselect3
# Ein neues Auswahl-Prompt
PS3="Datei zum Editieren auswählen : "
# Hier den Editor Ihrer Wahl angeben
EDIT=vi
select auswahl in * Ende
do
case "$auswahl" in
Ende) echo "Ende" ; break ;;
"") echo "$REPLY: Ungültige Auswahl" ;;
*) [ -d "$auswahl" ] && \
echo "Verzeichnis kann nicht editiert werden" &&\
continue
$EDIT $auswahl
break ;;
esac
done
Das Script bei der Ausführung:
you@host > ./aselect3
1) 1 27) awritepipe~
2) acase1 28) bestellung.txt
3) acase1~ 29) bin
4) aecho1 30) data.dat
... ...
23) avalue~ 49) user.dat
24) awhile1 50) zitat.txt
25) awhile1~ 51) zitat.txt~
26) awritepipe 52) Ende
Datei zum Editieren auswählen : 2
Und zu guter Letzt können Sie mit select auch Untermenüs erzeugen, sprich mehrere select-Anweisungen verschachteln. Wollen Sie hierbei ein anderes Prompt verwenden, müssen Sie allerdings PS3 in der Verschachtelung mit einem neuen Inhalt versehen. Hier ein Beispiel eines solchen Untermenüs:
# Demonstriert die select-Anweisung
# aselect4
# Ein neues Auswahl-Prompt
PS3="Bitte wählen : "
select auswahl in A B C Ende
do
case "$auswahl" in
Ende) echo "Ende" ; break ;;
"") echo "$REPLY: Ungültige Auswahl" ;;
A) select auswahla in A1 A2 A3
do
echo "Auswahl $auswahla"
done ;;
*) echo "Ihre Auswahl war : $auswahl" ;;
esac
done
Das Script bei der Ausführung:
you@host > ./aselect4
1) A
2) B
3) C
4) Ende
Bitte wählen : 1
1) A1
2) A2
3) A3
Bitte wählen : 2
Auswahl A2
Bitte wählen : ...
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|