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

Abbildung 1: Über Parameter formatieren Sie mittels »printf« die Ausgaben von Daten in der gewünschten Form.
Beachten Sie eine Besonderheit bei der Ausgabe von Zeichenketten (Strings): Das Leerzeichen dient normalerweise als Trenner. Das macht jedes Wort einer Zeile zu einem eigenen Variablenwert. In Listing 3 erhielten Sie also eine fünfzeilige Ausgabe, stünden im String der Variablen c Leerzeichen anstelle der Bindestriche.
Beim Aufbau von Menüs gehen Sie wie in Listing 4 vor. Besteht die Auswahlliste nur aus wenigen Punkten, verwenden Sie Ziffern zu deren Kennzeichnung. Damit steuern Sie das Skript komfortabel über den Ziffernblock. Gehen Ihnen die Zahlen aus, verwenden Sie stattdessen Kleinbuchstaben. Bei den Test-Anweisungen behandelt das Skript die Funktionsvariable als String: Das vermeidet verwirrende Fehlermeldungen bei der Eingabe von unpassenden Zeichen. Abbildung 2 zeigt das Beispiel in Aktion.
Listing 4
#! /bin/sh
while true; do
clear
echo "(1) Funktion A"
echo "(2) Funktion B"
echo "(9) Ende"
echo " "
echo -n "Funktion auswählen: "; read f
if [ "$f" = "1" ]; then
echo "FUNKTION A";sleep 3
elif [ "$f" = "2" ]; then
echo "Funktion B";sleep 3
elif [ "$f" = "9" ]; then
exit
fi
done
Das Beispiel aus Listing 5 (Abbildung 3) zeigt eine Maske zum Bearbeiten von Daten für eine Adressverwaltung. Für den praktischen Einsatz wären noch die Funktionen zum Holen und Sichern der Daten in einer Datenbank notwendig.
Listing 5
#! /bin/sh
# Belegung Beispieldaten
# An diese Stelle würde ein Datenbankzugriff integriert
a="Herr"
b="Pano Garçon"
c="Testsystem 123"
d="90003 Nürnberg"
while true; do
clear
echo "-------------------------------------------"
echo " Adressbearbeitung"
echo "------+----------+-------------------------"
echo "F-Nr. | | Wert"
echo " 1 | Anrede: | "$a
echo " 2 | Name: | "$b
echo " 3 | Straße: | "$c
echo " 4 | PLZ/Ort: | "$d
echo "------+----------+-------------------------"
echo "Aktionen: [F-Nr]: Zeile ändern, [s] speichern,"
echo "[q] Abbruch"
echo -n "Aktion: ";read wn
if [ "$wn" = "1" ]; then
a=$(readpreprompt "Zeile $wn: " "$a")
elif [ "$wn" = "2" ]; then
b=$(readpreprompt "Zeile $wn: " "$b")
elif [ "$wn" = "3" ]; then
c=$(readpreprompt "Zeile $wn: " "$c")
elif [ "$wn" = "4" ]; then
d=$(readpreprompt "Zeile $wn: " "$d")
elif [ "$wn" = "s" ]; then
echo "Hier würde in die Datenbank geschrieben werden"
break
elif [ "$wn" = "q" ]; then
exit
fi
done
echo "-----------------------------"
echo $a
echo $b
echo $c
echo $d

Abbildung 3: Mit wenigen Zeilen Shell-Code haben Sie eine einfach Maske zum Bearbeiten von Daten aus einer Datenbank erstellt.
Falls Sie PostgreSQL den Shell-Client psql nutzen, löschen Sie das bei der Datenabholung und Variablenbelegung enthaltene führende Leerzeichen. Mittels cut weisen Sie den Wert erst ab dem zweiten Byte der Variablen zu:
b=$(psql -t -c "select name from adressen where orgnr = 1;" | cut -b 2-)
Im Beispiel sprechen Sie die Datenzeilen mit Nummern und die Funktionen mit Buchstaben an. Nach jeder Änderung baut das Skript den Bildschirm neu auf.
Mit Dialog
Das Programm Dialog [2] liegt vielen aktuellen Distributionen bei. Die Anweisungen setzen sich aus Befehlen zum Gestalten der Fenster, für den Typ und aus geometrischen Anweisungen zusammen. Am Anfang der Anweisung zum Gestalten geben Sie den Titel und einen Hintergrundtitel an. Ferner erwarten die Befehl am Ende zwingend Angaben zur Geometrie.
Die Zeiten des Kästchenzählens sind aber dank Dialog vorbei: Wollen Sie keine Angaben für Höhe (Zeilen) und Breite (Zeichen) machen, geben Sie einfach 0 0 an. Das klappt bei den meisten Anweisungen. Das Tool passt die Proportionen dann automatisch an. Listing 6 zeigt den Aufbau des Befehls.
Listing 6
$ dialog --title "Titel" --backtitle "Hintergrundtitel" Weitere Anweisungen 0 0
In den Anweisungen zum Fenstertyp geben Sie an, was in dieser Codezeile passiert. Möchten Sie, dass der Benutzer etwas liest, eingibt oder entscheidet? In der Tabelle “Fenstertypen” finden Sie eine Auswahl an Möglichkeiten.
Fenstertypen
Während die Ja/Nein-Frage und die Nachrichtenbox stets auf eine Eingabe warten, dient die Infobox zur reinen Ausgabe. Im Zusammenhang mit sleep zeigen Sie so Nachrichten für eine bestimmte Zeit an. Anstelle von sleep ließen sich natürlich andere Programme einbinden.
Sie haben die Möglichkeit, die Ja/Nein-Frage um je eine Schaltfläche zu erweitern. Eine Schaltfläche mit eigener Beschriftung erhalten Sie mit folgenden zusätzlichen Parametern:




















