Startseite>Menüs und Masken in der Shell nutzen mit Dialog
Aus Raspberry Pi Geek 06/2014

Menüs und Masken in der Shell nutzen mit Dialog

© Malalena, sxc.hu

Mehr Komfort

Harald Zisler

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.

README

Für die Shell gibt es vorgefertigte Bausteine, die es erlauben, eine einfache Oberfläche mit Textfeldern, Listen und Auswahl in wenigen Zeilen zu programmieren. Damit ermöglichen Sie Anwendern ein komfortables Interface zu Ihrem Skript.

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 sich noch etwas mehr Komfort, wenn Sie auf grafische Dialog-Pendants wie beispielsweise 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
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland