Frage und Antwort
out of the box
Ja oder nein
Für einen kurzen Test geben Sie das Kommando dialog --yesno "Spielen Sie ein Instrument?" 15 60 ein. Es sollte eine Box von 60 Zeichen Breite und 15 Zeilen Höhe mit dem Fragetext und zwei Buttons Yes und No erscheinen (Abbildung 2). Mit den Cursor-Tasten und [Tab] schalten Sie zwischen den Knöpfen hin und her, mit [Return] bestätigen Sie die Auswahl. Außerdem lassen sich die Buttons direkt durch die hervorgehobenen Buchstaben [y] und [n] anwählen. Auch ohne Auswahl können Sie die Box verlassen; dazu drücken Sie [Esc].
dialog gibt die von Ihnen getroffene Auswahl in der speziellen Shell-Variablen namens ? zurück. Diese Variable – abfragbar mit echo $? – enthält grundsätzlich den numerischen Rückgabewert des letzten Shell-Kommandos. Im Fall der yesno-Box bedeutet 0 ja, 1 nein und 255 Abbruch ohne Auswahl.
Eingebettet
Um dialog sinnvoll einzusetzen, bettet man es in ein Shell-Skript ein, das abhängig vom Rückgabewert verschiedene Dinge tut. Listing 1 gibt ein Beispiel.
Listing 1
Shell-Skript mit Dialog
#!/bin/sh
dialog --backtitle Quiz --title Musikfrage \
--yesno "Spielen Sie ein Instrument?" 15 60
ans=$?
if [ $ans = 255 ] ; then
echo Abgebrochen
exit
fi
if [ $ans = 1 ] ; then
dialog --backtitle Quiz --title Aufforderung \
--msgbox "Na dann lernen Sie doch mal eins!" 15 40
exit 0
else
dialog --backtitle Quiz --title Details \
--radiolist "Welches Instrument spielen Sie? \
Sie können nur eins wählen." 16 60 5 \
"Geige" "(Streichinstrument)" off \
"Gitarre" "(Saiteninstument)" on \
"Klavier" "(Tasteninstument)" off \
"Trompete" "(Blasinstument)" off \
"Bass" "(Saiteninstument)" off 2> /tmp/dialog.sel
instr=$(cat /tmp/dialog.sel)
rm /tmp/dialog.sel
if [ -z $instr ] ; then
echo Abgebrochen
exit
fi
dialog --backtitle Quiz --title "Quiz beendet" \
--msgbox "Sie spielen also $instr. Dann lassen Sie mal \
hören… klingt ja grauenvoll! ;-)" 16 40
fi
Eine Reihe weiterer Optionen ist hier dazu gekommen. So bekommen die jeweiligen Boxen mit --backtitle und --title vernünftige Überschriften verpasst. Der Rückgabewert der ersten Box wird in der Variablen ans gespeichert und mit if-Konstrukten ausgewertet. Die Option --msgbox veranlasst dialog, eine einfache Nachricht ohne Wahlmöglichkeit darzustellen. Das Flag --radiolist stellt hingegen eine Liste dar, von der nur ein Element mit der Leertaste wählbar ist (Abbildung 3), ähnlich den Stationstasten bei einem Radio (daher der Name der Option).
Die Auswahl eines Radiolisten-Elements wird nicht numerisch zurückgegeben, sondern als Text auf dem Standardfehlerkanal (stderr). Entsprechend muss dieser zum Zwischenspeichern in eine temporäre Datei umgeleitet werden – dies geschieht mit dem Konstrukt 2> /tmp/dialog.sel. Der Inhalt dieser Datei wird in die Variable instr geschrieben. Ist diese leer (dies wird mit -z geprüft), wurde die Auswahl mit Cancel oder [Esc] abgebrochen. Andernfalls wird ihr Inhalt in einer weiteren msgbox dargestellt und das Skript beendet.



