Ihre Papiere bitte…
Teil 4: Kontrollstrukturen
Test
Das im Bedingungs-Teil wohl am häufigsten benutzte Programm ist test. Hierbei handelt es sich um ein Hilfsmittel, mit dem umfangreiche Bedingungen aufgebaut werden können. Das Ergebnis von test ist wahr oder falsch.
if test $A = $B; then echo "A und B sind gleich." fi
Wie Sie vielleicht merken, haben wir Ihnen test gleich im ersten Beispiel untergeschoben, und zwar in der Kurzschreibweise als [ ]. Tatsächlich sind die eckigen Klammern ein Synonym (Alias) von test, das in der Bash definiert ist. In Tabelle 1 finden Sie eine Liste aller Parameter, die Sie im Zusammenhang mit test verwenden können.
Tabelle 1: Die Optionen von test
| Eigenschaften von Dateien | |
|---|---|
| -e Datei | wahr, wenn Datei existiert
|
| -r Datei | wahr, wenn Datei existiert und lesbar ist
|
| -w Datei | wahr, wenn Datei existiert und beschreibbar ist
|
| -x Datei | wahr, wenn Datei existiert und ausführbar ist
|
| -s Datei | wahr, wenn Datei existiert und länger als null Bytes ist
|
| Datei1 -nt Datei2 | wahr, wenn Datei1 neuer ist als Datei2
|
| Datei1 -ot Datei2 | wahr, wenn Datei1 älter ist als Datei2
|
| Datei1 -ef Datei2 | wahr, wenn Datei1 und Datei2 ein und die selbe Datei sind (Hard-Link)
|
| -O Datei | wahr, wenn Datei existiert und dem aktuellen Benutzer gehört
|
| -G Datei | wahr, wenn Datei existiert und der Gruppe des aktuellen Benutzers gehört
|
| -f Datei | wahr, wenn Datei existiert und eine normale Datei ist
|
| -d Datei | wahr, wenn Datei ein Verzeichnis ist
|
| -L Datei | wahr, wenn Datei existiert und ein symbolischer Link ist
|
| -b Datei | wahr, wenn Datei ein Block-Device ist
|
| -c Datei | wahr, wenn Datei ein Character-Device ist
|
| -p Datei | wahr, wenn Datei existiert und eine Pipe ist
|
| -S Datei | wahr, wenn Datei existiert und ein Socket ist
|
| -t fd | wahr, wenn fd ein auf einem Terminal geöffneter Dateibezeichner ist
|
| -u Datei | wahr, wenn Datei existiert und das SUID-Bit gesetzt ist
|
| -g Datei | wahr, wenn Datei existiert und das SGID-Bit gesetzt ist
|
| -k Datei | wahr, wenn Datei existiert und das Sticky-Bit gesetzt ist
|
| Verkettung von Bedingungen | |
| ! Bedingung | wahr, wenn Bedingung falsch ist, und umgekehrt
|
| Bedingung1 -a Bedingung2 | wahr, wenn beide Bedingungen wahr sind |
| Bedingung1 -o Bedingung2 | wahr, wenn eine der beiden Bedingungen wahr ist |
| Vergleich von Zeichenketten | |
| String1 = String2 | wahr, wenn String1 und String2 gleich sind
|
| String1 == String2 | wie String1 = String2
|
| String1 != String2 | wahr, wenn String1 und String2 nicht gleich sind
|
| String1 < String2 | wahr, wenn String1 alphabetisch vor String2 eingeordnet wird
|
| String1 > String2 | wahr, wenn String1 alphabetisch hinter String2 eingeordnet wird
|
| -z String | wahr, wenn String die Länge null hat
|
| -n String | wahr, wenn String länger als null Zeichen ist.
|
| String | wie -n String
|
| Vergleich von Zahlenwerten | |
| Wert1 -eq Wert2 | wahr, wenn Wert1 und Wert2 arithmetisch gleich sind
|
| Wert1 -ne Wert2 | wahr, wenn Wert1 und Wert2 arithmetisch ungleich sind
|
| Wert1 -lt Wert2 | wahr, wenn Wert1 arithmetisch kleiner als Wert2 ist
|
| Wert1 -le Wert2 | wahr, wenn Wert1 arithmetisch kleiner oder gleich Wert2 ist
|
| Wert1 -gt Wert2 | wahr, wenn Wert1 arithmetisch größer als Wert2 ist
|
| Wert1 -ge Wert2 | wahr, wenn Wert1 arithmetisch größer oder gleich Wert2 ist
|
| Bash-Optionen | |
| -o Option | wahr, wenn die Bash-Option Option eingeschaltet ist
|
Im nächsten Beispiel nutzen wir die Option -r von test, um erst das Vorhandensein der /etc/passwd festzustellen, bevor wir nach dem Benutzer tux suchen:
if [ -r /etc/passwd ]; then
if grep -q tux /etc/passwd; then
echo "Hallo Tux."
else
echo "Tux kenne ich nicht."
fi
else
echo "/etc/passwd nicht lesbar."
fi
Wichtig ist, dass Sie bei Verwendung der Klammern als Kurzschreibweise für test ein Leerzeichen zwischen Klammer und erster Option lassen, sonst erkennt die Bash das Kürzel nicht. Der Parameter "-r" prüft, ob es die Datei /etc/passwd gibt und ob sie lesbar ist. Wenn wir uns zudem vergewissern wollten, dass es sich bei /etc/passwd um eine reguläre Datei und nicht etwa um einen symbolischen Link handelt, müssen wir die Bedingung erweitern:
if [ -r /etc/passwd -a -f /etc/passwd ]; then
if grep -q tux /etc/passwd; then
echo "Hallo Tux."
else
echo "Tux kenne ich nicht."
fi
else
echo "/etc/passwd nicht lesbar oder nicht regulär."
fi
Die im Listing hervorgehobene Option "-a" bewirkt, dass beide Bedingungen getestet und mit einem "logischen Und" verknüpft werden. Sind beide wahr, ist das Ergebnis wahr – ist mindestens eine falsch, ist auch das Ergebnis falsch. Anders verhält sich das "logische Oder", bei test die Option "-o". Hier genügt eine wahre Bedingung, damit das Gesamtergebnis wahr wird. "-o" und "-a" können mehrfach vorkommen. Es werden dann von links nach rechts zunächst alle "Und"-Verknüpfungen und dann alle "Oder"-Verknüpfungen ausgewertet.
Mehrfach-Bedingungen mit Bash-Mitteln
Doch der logischen Verknüpfung mittels test sind Grenzen gesetzt. So ist es zum Beispiel nicht möglich, die Prüfung der /etc/passwd zusammen mit der Suche nach dem Benutzer tux durchzuführen. Hier müssen wir uns der logischen Operatoren && (Und) und || (Oder) aus der Bash bedienen, die wir im ersten Teil (LinuxUser 12/2000, S. 38ff) in Tabelle 2 vorgestellt haben:
if [ -r /etc/passwd ] && grep -q tux /etc/passwd; then echo "Hallo Tux." else echo "Tux kenne ich nicht." fi
Einziger Nachteil dieser Lösung: Ist /etc/passwd nicht lesbar, erhalten wir die Meldung, den User tux gäbe es nicht. Wie auch im Beispiel der Option "-o" bei test lassen sich die logischen Operatoren der Bash mehrfach hintereinander benutzen und werden ebenfalls von links nach rechts ausgewertet.
Damit endet der vierte Teil des Programming Corners. In der nächsten Ausgabe wird uns das Thema Kontrollstrukturen weiter beschäftigen, insbesondere mit der Fallunterscheidung mittels case sowie den ersten Schleifen.



