Kapitel 15 Die Praxis
In diesem Kapitel finden Sie viele Lösungsansätze zu gewöhnlichen Themen, die man relativ häufig in der Praxis benötigt. Natürlich darf man hier keine kompletten Projekte erwarten, sondern eher Scripts, die weiter ausbaufähig sind bzw. als Anregung für umfangreichere Projekte dienen sollen. Es ist auch gar nicht möglich, für jedes Problem eine ultimative Lösung aus dem Hut zu zaubern, dazu sind die individuellen Ansprüche der einzelnen Anforderungen zu unterschiedlich.
Die einzelnen Rezepte für die Praxis wurden in die folgenden Teile aufgegliedert:
|
Alltäglich benötigte Scripts |
|
Datei-Utilities |
|
Systemadministration |
Benutzer- und Prozessverwaltung (Überwachung)
Systemüberwachung
Backups
(init-Scripts) Startup-Scripts erstellen
|
Netzwerk und Internet |
E-Mail
Log-File-Analyse
CGI-Scripts
15.1 Alltägliche Lösungen
15.1.1 Auf alphabetische und numerische Zeichen prüfen
Ein Problem bei vielen Scripts, die eine User-Eingabe erfordern, ist, dass ein »Vertipper« Dinge wie einen Datenbankschlüssel oder Dateinamen schnell durcheinander bringt. Eine Überprüfung auf die richtige Eingabe von der Tastatur fällt mittels sed recht einfach aus. Das folgende Beispiel überprüft, ob der Anwender Buchstaben und Zahlen korrekt eingegeben hat. Nicht erlaubt sind alle anderen Zeichen wie Whitespaces, Punktationen, Sonderzeichen etc.
#!/bin/sh
# checkInput() : Überprüft, dass eine richtige Eingabe aus
# alphabetischen und numerischen Zeichen besteht
# Gibt 0 (=OK) zurück, wenn alle Zeichen aus
# Groß- und Kleinbuchstaben und Zahlen bestehen,
# ansonsten wird 1 zurückgegeben.
#
checkInput() {
if [ -z "$eingabe" ]
then
echo "Es wurde nichts eingegeben"
exit 1
fi
# Alle unerwünschten Zeichen entfernen ...
eingabeTmp="`echo $1 | sed -e 's/[^[:alnum:]]//g'`"
# ... und dann vergleichen
if [ "$eingabeTmp" != "$eingabe" ]
then
return 1
else
return 0
fi
}
# Ein Beispiel zum Testen der Funktion checkInput
echo -n "Eingabe machen: "
read eingabe
if ! checkInput "$eingabe"
then
echo "Die Eingabe muss aus Buchstaben und Zahlen bestehen!"
exit 1
else
echo "Die Eingabe ist Ok."
fi
Das Script bei der Ausführung:
you@host > ./checkInput
Eingabe machen: 1234asdf
Die Eingabe ist Ok.
you@host > ./checkInput
Eingabe machen: asfd 1234
Die Eingabe muss aus Buchstaben und Zahlen bestehen!
you@host > ./checkInput
Eingabe machen: !"§$
Die Eingabe muss aus Buchstaben und Zahlen bestehen!
Entscheidend ist in diesem Script die sed-Zeile:
eingabeTmp="`echo $1 | sed -e 's/[^[:alnum:]]//g'`"
In der Variablen eingabeTmp befindet sich nach der Kommandosubstitution ein String ohne irgendwelche Sonderzeichen außer Buchstaben und Ziffern (siehe Zeichenklasse [:alnum:]). Hierbei werden einfach alle anderen Zeichen aus dem Originalstring entfernt und im nächsten Schritt wird der Originalstring mit dem so neu erstellten verglichen. Sind beide weiterhin identisch, wurden die Bedingungen erfüllt und die Eingabe war in Ordnung. Ansonsten, wenn beide Strings nicht gleich sind, wurde ein »Fehler« bei der Eingabe entdeckt.
15.1.2 Auf Integer überprüfen
Leider kann man hierbei jetzt nicht mit [:digits:] in der sed-Zeile auf die Eingabe eines echten Integer prüfen, da zum einen ein negativer Wert eingegeben werden kann und es zum anderen auch minimale und maximale Grenzen des Größenbereichs gibt. Daher müssen Sie das Script bzw. die Funktion ein wenig anpassen, um auch diese Aspekte zu berücksichtigen. Hier das Script, welches die Eingabe einer Integerzahl überprüft:
#!/bin/sh
# checkInt() : Überprüft, ob ein echter
# Integerwert eingegeben wurde
# Gibt 0 (== OK) zurück, wenn es sich um einen gültigen
# Integerwert handelt, ansonsten 1
#
checkInt() {
number="$1"
# Mindestwert für einen Integer (ggf. anpassen)
min=-2147483648
# maximaler Wert für einen Integer (ggf. anpassen)
max=2147483647
if [ -z $number ]
then
echo "Es wurde nichts eingegeben"
exit 1
fi
# Es könnte ein negativer Wert sein ...
if [ "${number%${number#?}}" = "-" ]
then # es ist ein negativer Wert – erstes Zeichen ein "-"
# das erste Zeichen nicht übergeben
testinteger="${number#?}"
else
testinteger="$number"
fi
# Alle unerwünschten Zeichen außer Zahlen entfernen ...
extract_nodigits="`echo $testinteger | \
sed 's/[[:digit:]]//g'`"
# Ist jetzt noch was vorhanden
if [ ! -z $extract_nodigits ]
then
echo "Kein numerisches Format!"
return 1
fi
# Mindestgrenze eingehalten ...
if [ "$number" -lt "$min" ]
then
echo "Der Wert ist unter dem erlaubten Mindestwert : $min"
return 1
fi
# max. Grenze eingehalten
if [ "$number" -gt "$max" ]
then
echo "Der Wert ist über dem erlaubten Maximalwert : $max"
return 1
fi
return 0 # Ok, es ist ein Integer
}
# Ein Beispiel zum Testen der Funktion checkInput
#
echo -n "Eingabe machen: "
read eingabe
if ! checkInt "$eingabe"
then
echo "Falsche Eingabe – Kein Integer"
exit 1
else
echo "Die Eingabe ist Ok."
fi
Das Script bei der Ausführung:
you@host > ./checkInt
Eingabe machen: 1234
Die Eingabe ist Ok.
you@host > ./checkInt
Eingabe machen: –1234
Die Eingabe ist Ok.
you@host > ./checkInt
Eingabe machen: –123412341234
Der Wert ist unter dem erlaubten Mindestwert : –2147483648
Falsche Eingabe – Kein Integer
you@host > ./checkInt
Eingabe machen: 123412341234
Der Wert ist über dem erlaubten Maximalwert : 2147483647
Falsche Eingabe – Kein Integer
15.1.3 echo mit oder ohne -n
Wen es bislang genervt hat, ob denn nun seine Shell die Option –n für das Verhindern eines Zeilenumbruchs nach einer echo-Ausgabe oder das Escape-Zeichen \c kennt, und sich nicht darauf verlassen will, dass print oder printf auf dem System vorhanden ist, dem kann mit einer einfachen Funktion geholfen werden:
#!/bin/sh
# myecho() : Portables echo ohne Zeilenumbruch
myecho() {
# Weg mit dem Newline, falls vorhanden
echo "$*" | tr -d '\n'
}
# Zum Testen ...
#
myecho "Eingabe machen : "
read eingabe
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|