Aus LinuxUser 03/2014

Menüs und Masken in der Shell nutzen mit Dialog

© Malalena, sxc.hu

Mehr Komfort

Von einfachen Abfragen bis hin zu komplexen Menüs: Mit dem Toolkit Dialog bauen Sie eine grafische Oberfläche für Shell-Skripte, die oft nicht mehr als eine zusätzliche Zeile brauchen.

Eigentlich handelt es sich bei der Shell ja schon um eine Benutzerschnittstelle – aber kaum ein Nutzer fragt Daten noch auf Zeilenbasis ab. Um den Gewohnheiten der modernen Anwender Rechnung zu tragen, gibt es mit Dialog ein textbasiertes GUI-Toolkit, das die Elemente einer grafischen Oberfläche nachbildet.

Die Optik wirkt etwas antiquiert, aber in Sachen Schnelligkeit ist die Technik kaum zu übertreffen. Läuft auf dem System ein X-Server, verschaffen Sie Ihren Nutzern noch etwas mehr Komfort, wenn Sie auf grafische Dialog-Pendants wie Zenity oder Gtkdialog setzen (siehe Kasten „Verwandte“).

Verwandte

Neben dem hier gezeigten Dialog existieren weitere Projekte mit gleichem Zweck. In der Tabelle „Alternativen“ finden Sie heraus, in welchem Umfang die anderen Kandidaten die Fenstertypen anbieten. Einige der Alternativen benötigen eine grafische Benutzeroberfläche: Dazu gehören Xdialog [3], Zenity [4], Kdialog [5] und Gtkdialog [6]. Letzteres weicht vom üblichen Muster ab: Hier erstellen Sie XML-Dateien mit den Anweisungen, die das Programm beim Aufruf einliest.

Alternativen

Dialog-Befehl Xdialog Zenity Kdialog
--yesno --yesno --question --yesno
--msgbox --msgbox --warning oder --info --msgbox
--infobox --infobox --passivepopup
--textbox --textbox --textinfo --textbox
--tailbox --tailbox
--pause
--gauge --gauge --progress --progressbar
--form
--inputmenu --2inputsbox/--3inputsbox
--calendar --calendar --calendar --calendar
--timebox --timebox
--inputbox --inputbox --entry --inputbox
--editbox --editbox --textinfo --textinputbox
--dselect --dselect --file-selection --getexistingdirectory
--fselect --fselect --file-selection --getopenfilename/--getsavefilename
--checklist --checklist --list --checklist
--radiolist --radiolist --list --radiolist
--menu --menubox -- list --menu

Masken und Menüs

Möchten Sie Daten vom Benutzer abfragen, bietet sich bei einfachen Zeichenketten der in die Bash eingebaute Befehl read an, der oft in Kombination mit dem Kommando echo zum Einsatz kommt. Möchten Sie den Prompt für die Eingabe abändern, geben Sie über die Option -p einen neuen Text vor (Listing 1).

Über die Option -n (Zeile 4) verhindern Sie das Newline am Ende der Echo-Anweisung. Daher erscheint der Text direkt rechts vom Read-Prompt. Anführungszeichen in der Ausgabe maskieren Sie mittels eines Rückstrichs („Backslash“), damit diese keinen Einfluss auf das Ergebnis haben. Die beiden Methoden aus Zeile 4 und Zeile 7 erzeugen das gleiche Ergebnis.

Listing 1

#! /bin/sh
echo "---------------------------"
echo "echo -n \"Eingabe: \";read a"
echo -n "Eingabe: ";read a
echo "---------------------------"
echo "read -p \"Eingabe: \" a"
read -p "Eingabe: " a
echo "---------------------------"

Mit der Option -i Text in Kombination mit -e (Readline-Support) geben Sie dem Benutzer schon eine Eingabe am Prompt vor. Etwas komfortabler klappt das mit dem externen Programm Readpreprompt [1]. Für den korrekten Einsatz führen Sie das Kommando in einer Subshell aus (Listing 2, Zeile 3). Das Tool liefert das Ergebnis der Abfrage auf die Standardausgabe. Mit diesem Befehl gestalten Sie leicht Masken für Datenbankanwendungen.

Listing 2

#! /bin/sh
a="Alter Wert"
a=$(readpreprompt "Eingabe: " "$a")
echo $a

Der eingebaute Befehl echo bietet nur wenig Einfluss auf das Format der Ausgabe. Um Zahlenwerte exakt positioniert auf den Bildschirm zu schreiben, hilft Ihnen das der Programmiersprache C entliehene printf. Bei der Ausgabe von Zahlenwerten mit Nachkommastellen nimmt Ihnen der Befehl das Auf- oder Abrunden ab, zudem berücksichtigt er die Spracheinstellungen der Shell.

Der grundsätzliche Aufbau von Printf-Kommandos folgt dem Aufbau printf "%Format" Daten. Die wichtigsten Anweisungen zum Formatieren finden Sie in der Tabelle „Mit Format“. Der Befehl unterscheidet zwischen Komma und Punkt als Dezimaltrenner. Im Ernstfall passen Sie die Variable LC_NUMERIC oder LANG mittels set und unset innerhalb des Skripts an.

Mit Format

Beispiel Erläuterung
%5.2f Fließkommazahl mit fünf Stellen vor und zwei nach dem Trenner
%.10s Zeichenkette mit maximal zehn Zeichen Breite
%X\n Hexadezimalzahl mit Großbuchstaben
%x\n Hexadezimalzahl mit Kleinbuchstaben
%#X\n Hexadezimalzahl mit Großbuchstaben und führendem 0X
%i\n Ganzzahl (Integer)

Einfacher bringen Sie jedoch mittels tr die Eingabedaten gleich auf das richtige Format. Dies integrieren Sie bei Bedarf direkt in die Anweisung (Listing 3, Beispiel 2). Die Anweisungen für Printf schließen Sie immer mit einem Newline (\n) ab. In einigen Fällen erlaubt der Befehl auch Tabulatoren. Die Beispiele in Listing 3 zeigen die wichtigsten Funktionen, Abbildung 1 die Ergebnisse.

Listing 3

#! /bin/bash
# Beispielwerte
a=987,455
b=987.455
c="Das-ist-ein-langes-Wort"
d=30
# Beispiel 1
# Ausgabe Fließkommazahl, Rundung auf 2 Stellen
printf "%5.2f\n" $b
# Beispiel 2
# Ausgabe Fließkommazahl mit "falschem" Dezimaltrenner
printf "%5.2f\n" `echo $a | tr , . `
# Beispiel 3
# Textausgabe auf zehn Zeichen gekürzt
printf "%.10s\n" $c
# Beispiel 4
# Numerische Umwandlungen bei Darstellung:
# Ganzzahl, Hexadezimalzahl, Oktalzahl
printf "%i %X %o\n" $d $d $d
# Beispiel 5
# Numerische Ausgabe Ganzzahl,
# Hexadezimalzahl (Kleinbuchstaben) mit führenden "0x"
printf "%i  %#x\n " $d $d
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: HeftseitenPreis €0,99
(inkl. 19% MwSt.)
KAUFEN
LinuxUser 03/2014 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: