Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
schwerpunkt<br />
Bash-Skripting<br />
Listing 4<br />
Listing 5<br />
#!/bin/bash<br />
tels ‐f übergeben Sie den Dateinamen<br />
mit der Liste der zu archivierenden<br />
Elemente, mittels ‐d das<br />
Zielverzeichnis für die Archivdatei<br />
(in der Voreinstellung /save).<br />
Dabei überprüft das Skript, ob<br />
das Zielverzeichnis mit dem absoluten<br />
Pfadnamen beginnt. Das<br />
Konstrukt ${OPTARG:0:1} verdient<br />
besondere Aufmerksamkeit. Sie<br />
haben die Möglichkeit, die Variablen<br />
in geschweifte Klammern einzufassen:<br />
$1 können Sie als ${1}<br />
schreiben <strong>und</strong> $CAT als ${CAT}.<br />
Diese Syntax ist nützlich. Sie erlaubt<br />
es Ihnen, Parameter über<br />
die neunte Position hinaus anzugeben:<br />
${11} steht zum Beispiel<br />
für den elften Parameter des<br />
Skripts, wohingegen $11 zum ersten<br />
Argument des Skripts gefolgt<br />
von einer 1 expandiert. Diese<br />
if [ ‐z $DIRS ]; then # Datei mit Verzeichnisliste<br />
vorhanden?<br />
echo "Die Option ‐f für die Listendatei fehlt."<br />
exit 1<br />
elif [ ! ‐r $DIRS ]; then<br />
echo "Kann die Datei $DIRS nicht finden oder einlesen."<br />
exit 1<br />
fi<br />
DAT="$(/bin/date +%d%m%g)"<br />
/bin/tar ‐${ZIP‐z} ‐c ‐f /$DEST/${PREFIX}_$DAT.${EXT‐tgz}<br />
`cat $DIRS` > /dev/null<br />
if [ $# ‐lt 1 ]; then # kein Argument,<br />
Eingabeaufforderung einblenden<br />
read ‐p "Wen wollten Sie überprüfen? " WHO<br />
if [ ‐z $WHO ]; then # kein Name wurde eingetragen<br />
exit 0<br />
fi<br />
else<br />
WHO="$1"<br />
# speichert das<br />
Kommandozeilen‐Argument<br />
fi<br />
LOOK=$(w | grep "^$WHO")<br />
if [ $? ‐eq 0 ]; then # vorherigen Befehlsstatus<br />
überprüfen<br />
WHEN=$(echo $LOOK | awk '{print $4}')<br />
echo "$WHO ist angemeldet seit $WHEN."<br />
else<br />
echo "$WHO ist zurzeit nicht angemeldet."<br />
fi<br />
exit 0<br />
Syntax ermöglicht es ebenfalls,<br />
Variablen vom umgebenden Text<br />
zu isolieren: Wenn der Wert von<br />
HAUSTIER zum Beispiel katze ist,<br />
dann expandiert ${HAUSTIER}2 zu<br />
katze2, während $HAUSTIER2 sich<br />
auf den Wert der Variable HAUS‐<br />
TIER2 bezieht, der vielleicht nicht<br />
definiert ist.<br />
Die Zeichenkette :0:1 nach dem<br />
Variablennamen extrahiert einen<br />
Substring aus OPTARG, angefangen<br />
an der ersten Position (die Position<br />
der Schriftzeichen beginnt<br />
mit 0) <strong>und</strong> fortgesetzt bis zum<br />
ersten Schriftzeichen, mit anderen<br />
Worten: Es bleibt das erste<br />
Schriftzeichen übrig.<br />
Die If-Anweisung überprüft<br />
dann, ob es sich dabei um einen<br />
Schrägstrich handelt. Falls nicht,<br />
erscheint eine Fehlermeldung,<br />
<strong>und</strong> das Skript endet mit einem<br />
Status von 1, was auf einen Fehler<br />
hinweist. Ein Status von 0 steht<br />
für einen erfolgreichen Durchlauf.<br />
Wenn eine Option ein Argument<br />
verlangt, dieses aber fehlt,<br />
ersetzt Getopts die Variable OPT<br />
Listing 6<br />
#!/bin/bash<br />
/bin/cat /usr/local/sbin/email_<br />
list |<br />
while read WHO WHAT SUBJ; do<br />
/usr/bin/mail ‐s "$SUBJ" $WHO<br />
< $WHAT<br />
echo $WHO<br />
done<br />
Listing 7<br />
#!/bin/bash<br />
mit einem Doppelpunkt <strong>und</strong> fügt<br />
den entsprechenden String in<br />
OPTARGS ein. Der vorletzte Abschnitt<br />
der Case-Anweisung arbeitet<br />
diese Fehler auf. Der letzte<br />
Abschnitt behandelt alle ungültigen<br />
Optionen. Getopts ersetzt in<br />
diesem Fall die Variable durch ein<br />
Fragezeichen <strong>und</strong> legt die unbekannte<br />
Option in OPTARGS ab. Das<br />
Joker-Muster entdeckt <strong>und</strong> behandelt<br />
diese Ereignisse.<br />
Dieser Code zum Behandeln von<br />
Argumenten ist nicht h<strong>und</strong>ertprozentig<br />
sicher. Es gibt Kombinationen<br />
von Optionen, die das<br />
Skript erst später bemerkt. Fehlt<br />
zum Beispiel in der Folge ‐f ‐n<br />
das Argument von ‐f, hält das<br />
Skript fälschlicherweise ‐n dafür.<br />
Den Rest des Skripts von Listing<br />
3 sehen Sie in Listing 4.<br />
Die If-Anweisung überprüft<br />
zwei mögliche Probleme mit der<br />
Datei, welche die Verzeichnisliste<br />
enthält. Der erste Test überprüft,<br />
ob die Variable DIRS fehlt, das<br />
heißt, ob sie die Länge null hat.<br />
In diesem Fall endet das Skript<br />
mit einer Fehlermeldung.<br />
Der zweite Test nach elif überprüft,<br />
ob die angegebene Datei<br />
existiert <strong>und</strong> der Zugriff funktioniert.<br />
Wenn nicht (das Ausrufezeichen<br />
in dem Ausdruck dient<br />
als ein logisches NOT), gibt das<br />
Skript ebenfalls eine Fehlermeldung<br />
aus <strong>und</strong> beendet sich.<br />
Die letzten beiden Anweisungen<br />
richten den Datumsteil für das<br />
PATH=/bin:/usr/bin<br />
# setzt den Pfad<br />
. /usr/local/sbin/functions.bash # . f => Datei f hier einbinden<br />
printf "USER\tGB USED\n"<br />
# Kopfzeile für Bericht drucken<br />
for WHO in $(