Aus Raspberry Pi Geek 06/2014

Menüs und Masken in der Shell nutzen mit Dialog (Seite 3)

--extra-button --extra-label "Text"

Beim Betätigen erhalten Sie den Rückgabewert 3. Die zweite Erweiterungsmöglichkeit besteht mit der Hilfe-Fläche --help-button. Sie benötigen hier keine weiteren Angaben zur Beschriftung, der Rückgabewert beträgt 2. Zusammen mit Ja (0) und Nein (1) erzeugt das Widget also vier Rückgabewerte.

Das kleine Skript aus Listing 7 zeigt die Wirkungsweise. Sie sehen darin, wie Sie eine Schaltfläche abweichend beschriften oder belegen. Der Befehl im ersten Aufruf ist entsprechend ergänzt. Sie finden vor dem Parameter --yesno den zusätzlichen Parameter --ok-label "Text".

Listing 7

 

#! /bin/sh
while true; do
  dialog --title "Titel" --backtitle "Hintergrundtitel" --help-button --extra-button --extra-label "EXTRA"  --ok-label "Zustimmung" --yesno "FRAGETEXT" 0 0
  dialog --title "Titel" --backtitle "Hintergrundtitel" --msgbox "Rückgabewert: $?" 0 0
  dialog --title "Titel" --backtitle "Hintergrundtitel" --defaultno --yesno "Shellskript beenden?"  0 0
  if [ $? -eq 0 ]; then
    exit
  fi
done

Gleiches gilt analog für die Nein-Schaltfläche (--no-label "Text"), die Ja-Schaltfläche (--yes-label "Text") und die Hilfe (--help-label "Text"). Mit dem vorangestellten --defaultno in der letzten dialog-Anweisung steht die Auswahl nach dem Start auf No.

Bei der Fortschrittsanzeige übermitteln Sie den Prozentwert per Pipe auf das Dialog-Kommando (Listing 8). Das Element eignet sich ebenfalls zur Anzeige von Anteilen an einem Gesamtwert.

Listing 8

 

#! /bin/sh
prozent=0
while [ $prozent -lt 100 ]; do
  # Erzeugen der Prozent-Angabe
  prozent=$(echo "$prozent + 10" | bc)
  # Der Wert für gauge wird über die Pipe an dialog übergeben
  echo $prozent | dialog --title "Titel" --backtitle "Hintergrundtitel" --gauge "FORTSCHRITTSTEXT" 0 0
  # sleep nur für Demo!
  sleep 1
done

Listing 9 ist “gebrauchsfertig”: Es zeigt die Belegung der Platte durch das Verzeichnis /home an (Abbildung 4). Unübersichtlich gestaltet sich hier das Herauslösen der Werte aus der df-Abfrage. Der Prozentwert erscheint als Balken, der noch freie Speicherplatz im Klartext.

Listing 9

 

#! /bin/sh
# Prozentuale Belegung aus df -h übergeben
PROZENT=$(df -h | grep "/home" | tr -s ' ' | cut -d' '  -f5 | cut -d% -f1)
FREI=$(df -h | grep "/home" | tr -s ' ' | cut -d' ' -f4)
echo ${PROZENT} | dialog --title "Plattenbelegung von /home " --backtitle "Systemauskunft" --gauge "\n Aktuell freier Plattenplatz: ${FREI}B" 10 50
sleep 5
Abbildung 4: Mit einem Blick sehen Sie, wie voll die Home-Partition gerade ist.

Abbildung 4: Mit einem Blick sehen Sie, wie voll die Home-Partition gerade ist.

Formulare

Benötigen Sie nicht nur einfache Formulare, sondern eine komplexe Eingabemaske, so bietet Dialog auch dafür die passenden Elemente. Sie bewegen sich darin mit den Tabulator- und Pfeiltasten. Anfangs erscheint die Syntax unübersichtlich: Es gilt, viel mit Positions- und Größenangaben zu hantieren.

Listing 10 zeigt ein kleines Skript, welches das Editieren von Daten erlaubt und wie diese wieder zurück in Variablen ablegt, um diese dauerhaft zurückzuschreiben. Abbildung 5 zeigt, wie sich welche Positions- und Größenangabe des Befehls in der Maske auswirkt.

Listing 10

 

#! /bin/sh
a="Herr"
b="Meier"
c="Hans"
dialog --title "Titel" --backtitle "Kundendaten" --ok-label "Speichern" --stdout --form "Kartei"  10 60 3 "Anrede  " 1 1 "$a" 1 15 30 0 "Name " 2 1 "$b" 2 15 30 0 "Vorname  " 3 1 "$c" 3 15 30 0 > ausgabe.txt
a=$(cat ausgabe.txt | head -1)
b=$(cat ausgabe.txt | head -2 | tail -1)
c=$(cat ausgabe.txt | head -3 | tail -1)
rm ausgabe.txt
dialog --title "Titel" --backtitle "Hintergrundtitel" --msgbox "Gespeicherte Werte: \n $a \n $b \n $c " 0 0
Abbildung 5: Positions- und Größenangaben für die Elemente des Formulars.

Abbildung 5: Positions- und Größenangaben für die Elemente des Formulars.

Damit das Umleiten der Ausgabe in eine Datei klappt, setzen Sie vor --form zwingend die zusätzliche Anweisung --stdout ein. In der Nachrichtenbox (msgbox) verwenden Sie das Zeichen für ein Newline (\n), um den Wert jeder Variablen in einer neuen Zeile auszugeben.

Formulare mit der Funktion inputmenu benötigen weniger Größen- und Positionsparameter, jedoch erhalten Sie am Ende nicht die Daten sämtlicher Felder. Je Dialog-Aufruf besteht zudem nur die Möglichkeit, ein einzelnes Feld zu ändern.

Die Ausgabe umfasst die Aktion (RENAMED), den Feldbezeichner und die Daten. Damit die Ausgabe funktioniert, müssen Sie wie zuvor bei --inputmenu die Option --stdout setzen. Das Nachbearbeiten der Daten erfolgt mit cut (Listing 11).

Listing 11

 

#! /bin/sh
neuwert=$(dialog --title "Titel" --backtitle "Hintergrundtitel" --stdout --inputmenu "MENÜÜBERSCHRIFT" 17 60 15 "Zeile-1 >" "Wert 1" "Zeile-2 >" "Wert 2" "Zeile-3 >" "")
spalte=$(echo $neuwert | cut -d \> -f 1 | cut -b 9-)
eintrag=$(echo $neuwert | cut -d \> -f 2 | cut -b 2-)
dialog --title "Titel" --backtitle "Hintergrundtitel" --msgbox "Gespeicherte Werte: \n $neuwert \n $spalte \n $eintrag " 0 0
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben