8.9    Menüs bilden mit select

In der Regel wird eine Benutzereingabe mit mehreren Möglichkeiten folgendermaßen getätigt: Auf dem Bildschirm werden die Möglichkeiten ausgegeben, und der Benutzer bzw. die Benutzerin gibt die gewünschte Auswahl ein. Dabei wird beispielsweise ein String »backup« eingegeben, um das Dateisystem zu archivieren. Doch was passiert, wenn »Backup«, »Bäckup« oder »Bkup« eingegeben wird? Das Skript wird eine Fehlermeldung liefern und sich beenden bzw. eine unvorhergesehene Aktion durchführen und eventuell Schaden am System anrichten.

Mithilfe der select-Anweisung können Menüs besser aufgebaut werden. Den Auswahlmöglichkeiten sind dabei Zahlen zugeordnet, die die Benutzerinnen und Benutzer auswählen können. Dabei kann von der Anwenderseite her wesentlich weniger schieflaufen. Zudem wird bei unbekannter Eingabe einfach eine erneute Eingabeaufforderung ausgegeben, sodass kein zufälliger oder falscher Code ausgeführt wird.

Die Syntax ist der for-Schleife ähnlich. In der Eingabevariablen wird der Wert der gewählten Auswahl hinterlegt.

select AUSWAHL in MöglichkeitA MöglichkeitB …
do
     Anweisung(en)
done

Listing 8.48     select-Syntax

Natürlich gibt es wie immer ein Beispiel, das Ihnen die eigentliche Funktionsweise etwas offener darlegen sollte, als es die bloße Syntax könnte. Das folgende Skript bietet die Auswahl einer Logdatei im Verzeichnis /var/log an. Die ausgewählte Datei wird mit dem tail-Programm überwacht. Das Skript wird durch die Tastenkombination (Strg) + (C) bzw. mithilfe der exit-Funktion beendet.

#!/bin/bash

cd /var/log

select AUSWAHL in authlog daemon syslog maillog \
                  ftpd named.log exit
do
    if [ "$AUSWAHL" == "exit" ]; then
        exit
    fi
    tail -f  $AUSWAHL
done

Listing 8.49     Logwatcher mit select und tail

Bei der Eingabeaufforderung für die Menüauswahl wird der Prompt $PS3 angezeigt. Dieser ist, wie wir bereits weiter oben beschrieben haben, eine Variable. Wird diese Variable mit einem anderen Wert versehen, können Sie Ihre eigene Aufforderungsmeldung definieren: export PS3='input>'.