Dialogboxen

Ein Frage-Anwort-Spiel auf der Konsole verleitet zu leicht zu Fehleingaben durch den Benutzer. Und um diese im Programm zu behandeln, bedarf es oft umständlicher Programmkonstrukte...
Viel besser wäre es z.B. dem Nutzer durch Vorgabe eines Menüs die möglichen Optionen eines Programmes zu präsentieren. Die Lösung liegt in der Realisierung von Dialogboxen mit Hilfe von dialog.

Das Kommando dialog wird durch Optionen gesteuert:

      
Option Wirkung
--checklist Dient der Auswahl von Optionen.
--clear Löscht bei Beendigung des Dialogs den Bildschirm (der allerdings blau bleibt, ein Aufruf von setterm -clear hilft).
--infobox Eine Nachricht wird eingeblendet.
--inputbox Dient der Eingabe von Daten.
--menu Dient zur Auswahl von einem aus mehreren Menüpunkten.
--msgbox Wie --infobox, allerdings muss der Nutzer die Nachricht mit "OK" bestätigen.
--textbox Eine als Parameter übergebene Datei wird angezeigt. Kann diese nicht vollständig im Fenster dargestellt werden, werden Scrollbars eingefügt.
--title In der ersten Zeile des Dialogs wird ein Titel angezeigt.
         --yesno        Ein Ja/Nein-Dialog erscheint.

Aufgabenstellung

Als Beispiel wollen wir das vorherige Shellskript zum Löschen von Dateien durch die Verwendung von Dialogboxen verbessern.

Eine mögliche Lösung

Das Löschen der Dateien aus Ein komplexes Beispiel erfolgt nun menügesteuert.

#!/bin/sh

      object=
      tilde=
      core=
      inter=
1    dialog --clear --checklist \
2    'Make clean your file system' 10 70 4 \
3    '1' 'Core-Files' off \
4    '2' 'Object-Files' off \
5    '3' 'Backups' off \
6    '4' 'Prompt whether to remove each file?' on 2> ~/tmp.$$

7    options=$(cat ~/tmp.$$)
8    rm ~/tmp.$$

9    for i in $options; do
10       case "$i" in
11           \"1\" ) core=core;;
12           \"2\" ) object=.o;;
13           \"3\" ) tilde=\~;;
14           \"4\" ) inter=1;;
       15       esac
16   done

     for i in $core $object $tilde; do
         for x in $(find $(pwd) -name "*$i"); do
17           if [ $inter ]; then      
18               dialog --yesno "Removing $x?" 5 70
19               if [ $? = 0 ]; then  
20                  rm $x
21               fi
22             else
23               dialog --infobox "Removing $x" 5 70
24               rm $x
25           fi      
         done
     done

26   setterm -clear

Erläuterungen:

                                                                                                                                                                
         Zeile                 Bemerkung       
1-6         

Ein checklist-Dialog wird begonnen. Alle Zeilen müssten eigentlich auf einer einzigen Zeile stehen, durch das Fortsetzungszeichen \ lassen sich derartige lange Zeilen aber splitten.

Der Dialog erhält einen Titel (Zeile 2), Höhe (10 Zeilen), Breite (70 Spalten) und Anzahl der Einträge (4) werden vereinbart. Die vier Schalter werden beschriftet (Zeilen 3-6), die letzte Box wird vorbelegt (on / Abbildung). Bei Dialogende muss die Auswahl explitzit gespeichert werden. Eine Umlenkung in eine temporäre Datei ist sinnvoll. Als (hoffentlich) eindeutiger Name dient die PID des Shellskripts ($$).

Waren alle Optionen gesetzt, steht in der Datei tmp.PID Folgendes:

"1" "2" "3" "4"
7, 8        Die Optionen werden aus der temporären Datei ausgelesen, in der Variable    options gespeichert und die temporäre Datei gelöscht.       
9-16        Analog zum vorherigen Abschnitt. Um ein Muster wie "1" zu    vergleichen, müssen die Doppelanführungszeichen als solche gekennzeichnet werden.       
17        Im interaktiven Fall soll die Abfrage vor dem Löschen als Ja/Nein-Dialog   erfolgen.       
18        Abfrage, ob Datei gelöscht werden soll.       
19, 20        Der yesno-Dialog kehrt mit Status "0" zurück, falls der yes-Button    gewählt wurde;  Löschen!       
23       Das Löschen einer jeden Datei wird kurz in einer Infobox angezeigt.       
26        Der Bildschirm wird gelöscht (bleibt sonst blau).       


Dialogboxen