Aus Raspberry Pi Geek 05/2014

Erste Schritte mit Bash-Skripten (Seite 3)

In der Kommandozeile muss vor Optionsbuchstaben ein Bindestrich stehen. Einige Optionen verlangen ein Argument. Das zeigt immer der danach stehende Doppelpunkt – im Beispiel sind es die Buchstaben f, n und d. Der vor der ersten Option stehende Doppelpunkt verhindert, dass Getopts selbst Fehlermeldungen ausgibt – das wollen wir selbst übernehmen.

Innerhalb der While-Schleife sorgt eine Case-Anweisung für das fachgerechte Bearbeiten der Optionen. Die Anweisung vergleicht den Wert von OPT mit einer Liste von Mustern. Bei jedem Muster handelt es sich um eine Zeichenkette, die Platzhalter enthalten darf. Ein runde schließende Klammer beendet das Muster. Die Reihenfolge ist wichtig: Das erste passende Muster gewinnt.

Im Beispiel sind neben den Mustern für die erlaubten Optionsbuchstaben zusätzlich ein Doppelpunkt und ein Sternchen als Jokerzeichen für alles definiert, was die anderen Muster nicht abfangen. Die auszuführenden Befehle bei den einzelnen Optionen unterscheiden sich, jeder Abschnitt endet mit doppeltem Semikolon.

Über -n geben Sie ein alternatives Präfix für den Dateinamen des Archivs an. Dabei überschreiben Sie die Voreinstellung aus dem zweiten Befehl des Skripts. Über -b setzen Sie Bzip2 statt Gzip zum Komprimieren der Daten ein. Mittels -f übergeben Sie den Dateinamen mit der Liste der zu archivierenden Elemente, mittels -d das Zielverzeichnis für die Archivdatei (in der Voreinstellung /save).

Dabei überprüft das Skript, ob das Zielverzeichnis mit dem absoluten Pfadnamen beginnt. Das Konstrukt ${OPTARG:0:1} verdient besondere Aufmerksamkeit. Sie haben die Möglichkeit, die Variablen in geschweifte Klammern einzufassen: $1 können Sie als ${1} schreiben und $CAT als ${CAT}.

Diese Syntax ist nützlich. Sie erlaubt es Ihnen, Parameter über die neunte Position hinaus anzugeben: ${11} steht zum Beispiel für den elften Parameter des Skripts, wohingegen $11 zum ersten Argument des Skripts gefolgt von einer 1 expandiert. Diese Syntax ermöglicht es ebenfalls, Variablen vom umgebenden Text zu isolieren: Wenn der Wert von HAUSTIER zum Beispiel katze ist, dann expandiert ${HAUSTIER}2 zu katze2, während $HAUSTIER2 sich auf den Wert der Variable HAUSTIER2 bezieht, der vielleicht nicht definiert ist.

Die Zeichenkette :0:1 nach dem Variablennamen extrahiert einen Substring aus OPTARG, angefangen an der ersten Position (die Position der Schriftzeichen beginnt mit 0) und fortgesetzt bis zum ersten Schriftzeichen, mit anderen Worten: Es bleibt das erste Zeichen übrig.

Die If-Anweisung überprüft dann, ob es sich dabei um einen Schrägstrich handelt. Falls nicht, erscheint eine Fehlermeldung, und das Skript endet mit einem Status von 1, was auf einen Fehler hinweist. Ein Status von 0 steht für einen erfolgreichen Durchlauf.

Wenn eine Option ein Argument verlangt, dieses aber fehlt, ersetzt Getopts die Variable OPT mit einem Doppelpunkt und fügt den entsprechenden String in OPTARGS ein. Der vorletzte Abschnitt der Case-Anweisung arbeitet diese Fehler ab. Der letzte Abschnitt behandelt alle ungültigen Optionen. Getopts ersetzt in diesem Fall die Variable durch ein Fragezeichen und legt die unbekannte Option in OPTARGS ab. Das Joker-Muster entdeckt und behandelt diese Ereignisse.

Dieser Code zum Behandeln von Argumenten ist nicht hundertprozentig sicher. Es gibt Kombinationen von Optionen, die das Skript erst später bemerkt. Fehlt etwa in der Folge -f -n das Argument von -f, hält das Skript fälschlicherweise -n dafür. Den Rest des gesamten Sicherungsskripts, dessen Anfang Listing 3 bildet, sehen Sie in Listing 4.

Listing 4

 

[... Listing 3 ...]
if [ -z $DIRS ]; then  # Datei mit Verzeichnisliste vorhanden?
  echo "Die Option -f für die Listendatei fehlt."
  exit 1
elif [ ! -r $DIRS ]; then
  echo "Kann die Datei $DIRS nicht finden oder einlesen."
  exit 1
fi
DAT="$(/bin/date +%d%m%g)"
/bin/tar -${ZIP-z} -c -f /$DEST/${PREFIX}_$DAT.${EXT-tgz} `cat $DIRS` > /dev/null

Die If-Anweisung überprüft zwei mögliche Probleme mit der Datei, die die Verzeichnisliste enthält. Der erste Test prüft, ob die Variable DIRS die Länge null hat, also fehlt. In diesem Fall endet das Skript mit einer Fehlermeldung.

Der zweite Test nach elif überprüft, ob die angegebene Datei existiert und der Zugriff funktioniert. Wenn nicht (das Ausrufezeichen in dem Ausdruck dient als ein logisches NOT), gibt das Skript ebenfalls eine Fehlermeldung aus und beendet sich.

Die letzten beiden Anweisungen richten den Datumsteil für das Archiv ein und starten den Tar-Befehl. Letzterer verwendet eine Art bedingte Auflösung von Variablen, zum Beispiel ${EXT-tgz}. Der Bindestrich hinter dem Variablennamen zeigt an, dass der darauffolgende String zum Einsatz kommt, falls die Variable nicht definiert wurde.

Die Variablen EXT und ZIP sind nur dann definiert, wenn Sie die Option -b verwenden, nämlich durch die Werte tbz und j. Haben Sie diese nicht früher im Skript definiert, verwendet es nun die Werte z und tgz.

Alles nur Nummern

Die bisher gezeigten Beispiele haben den Vergleich von Zeichenfolgen und das Testen von Dateieigenschaften demonstriert. Listing 5 zeigt nun ein Beispiel für numerische Bedingungen. Dieses Skript entstand, um der Sekretärin des Vorsitzenden eines Unternehmens zu helfen: Sie kann damit jederzeit schnell nachsehen, wer gerade im Intranet angemeldet ist.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 9 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
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