Ü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.
Listing 5
#!/bin/bash
if [ $# -lt 1 ]; then # kein Argument: Eingabeaufforderung
read -p "Wen wollten Sie überprüfen? " WHO
if [ -z $WHO ]; then # kein Name wurde eingetragen
exit 0
fi
else
WHO="$1" # speichert das Argument
fi
LOOK=$(w | grep "^$WHO")
if [ $? -eq 0 ]; then # vorigen Befehlsstatus prüfen
WHEN=$(echo $LOOK | awk '{print $4}')
echo "$WHO ist angemeldet seit $WHEN."
else
echo "$WHO ist zurzeit nicht angemeldet."
fi
exit 0
Dieses Skript prüft zuerst, ob die Dame ein Argument in der Befehlszeile angegeben hat. Falls nicht (Anzahl der Argumente kleiner als 1), erscheint eine Eingabezeile zur Angabe des gewünschten Benutzers. Dabei kommt der eingebaute Befehl read zum Einsatz. Die Eingabe landet in der Variable WHO.
Hat WHO nach der Abfrage immer noch die Länge null, hat die Sekretärin keinen Benutzernamen eingetippt, sondern lediglich [Eingabe] gedrückt. In diesem Fall beendet sich das Skript. Ansonsten erhält WHO das in der Befehlszeile angegebene Argument als Wert.

