Aus Raspberry Pi Geek 06/2014

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

a=$(dialog --title "Titel" --backtitle "Hintergrundtitel" --stdout --radiolist "AUSWAHLÜBERSCHRIFT" 10 40 3 MARKE-1 "INFO-1" on MARKE-2 "INFO-2" off MARKE-3 "INFO-3" off)

Auf diese Weise setzen Sie eine Datensatz-Auswahl für eine Bearbeitungsmaske um. Dabei erstellt das Skript die Auswahl dynamisch aus der Datenabfrage. Die Marke besteht aus der Datensatznummer oder dem eindeutigen Merkmal, mit dem das Skript den Datensatz anschließend für die Maske einliest.

Das Beispiel in Listing 15 zeigt eine SQL-Abfrage mit dem Client Psql für die PostgreSQL-Datenbank. Ziel ist es, die Kundennummer orgnr an den weiteren Teil des Skripts zu übergeben. Die Anweisungen für das Menü mittels --radiolist schreibt das Skript in eine Variable und führt den Code mit eval aus. Für das weitere Gestalten eignen sich je nach Programmierstil die Fenstertypen --form oder --inputmenu.

Listing 15

 

#!/bin/sh
# Suchmaske für die Datenbankabfrage
sube=$(dialog --title "Kundensuche" --backtitle "Kundendatenverwaltung" --stdout --inputbox "Kundenname eingeben" 0 0 "")
# Prüfen, ob es zutreffende Daten gibt
a=$(psql -t -c "select orgnr from kunden where name = '$sube';")
if [ -z "$a" ]; then
  dialog --title "Kundensuche" --backtitle "Kundendatenverwaltung" --msgbox "Keine passenden Datensätze gefunden! " 0 0
  exit  # oder break, wenn in Schleife!
fi
# Daten für die Einfachauswahl holen und Aufbau Auswahl
#Zähler für den ersten "on"-Status
v=0
teil1=$(echo "a=\`dialog --title \"Kundensuche\" --backtitle \"Kundendatenverwaltung\" --stdout --radiolist \"gefunden: \" 10 40 3 ")
# Kundennummern ermitteln
for i in $(psql -t -c "select orgnr from kunden where name = '$sube' order by name, vorname, gebdat ;"); do
  if [ $v -eq 0 ]; then
    status="on"
    v=1
  else
    status="off"
  fi
  info=$(psql -t -c "select (name || ' ' || vorname || ' ' || gebdat) from kunden where orgnr = $i;";)
  teil2=`echo $teil2 $i \"$info\" $status`
done
auswahlmaske=$(echo "$teil1 $teil2\`")
echo $auswahlmaske
eval $auswahlmaske
dialog --title "Kundensuche" --backtitle "Kundendatenverwaltung" --msgbox "Datensatz Nr. $a ausgewählt " 0 0

Menüs zur Programmsteuerung gelingen mit dem Fenstertyp --menu. Er gibt eine Marke aus, die Sie anschließend auswerten. Wie bei fast allen anderen Wertübergaben schalten Sie auch hier --stdout vor den Fenstertyp. Ein Beispiel dazu zeigt Listing 16.

Listing 16

 

#!/bin/sh
while true; do
  a=`dialog --title "TITEL" --backtitle "HINTERGRUNDTITEL" --stdout --menu "MENÜÜBERSCHRIFT" 0 0 0 1 "ERSTE" 2 "ZWEITE" 9 "ENDE"`
  if [ $a -eq 1 ]; then
    dialog --title "Titel" --backtitle "Hintergrundtitel" --msgbox "Erster Eintrag gewählt" 0 0
  elif [ $a -eq 2 ]; then
    dialog --title "Titel" --backtitle "Hintergrundtitel" --msgbox "Zweiter Eintrag gewählt" 0 0
  elif [ $a -eq 9 ]; then
    dialog --title "Titel" --backtitle "Hintergrundtitel" --no-label "Programmende" --yes-label "Weitermachen" --yesno "Programmende ?" 0 0
    if [ $? -eq 1 ]; then
      break # oder exit
    fi
  fi
done

Fazit

Möchten Sie Ihre Shell-Skripts mit einer benutzerfreundlichen Oberfläche aufwerten, so finden Sie alles dazu Notwendige im Fundus von Dialog. Benötigen Sie nur einfache Abfrage, dann profitieren Sie sogar von den Vorteilen bereits vorgefertigter Bausteine. Andernfalls stellt sich vermutlich ohnehin die Frage nach einer Alternative zum Shell-Code. 

Der Autor

Harald Zisler beschäftigt sich seit vielen Jahren mit FreeBSD und Linux. Zu Technik- und EDV-Themen verfasst er Artikel und Bücher. Sein neuestes Werk ist die 2. Auflage “Computer-Netzwerke”, erschienen bei Galileo Press.

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