24.03.2014 Aufrufe

LinuxUser SHELL - Administrieren und Automatisieren ohne GUI (Vorschau)

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 $(

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!