Home / LinuxUser / 2001 / 04 / Teil 4: Kontrollstrukturen

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(161 Punkte bei 4 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

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.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 0 Punkte (1 Stimme)

Schlecht Gut

Infos zum Autor

Mirko Dölle

Redakteur für Linux bei c't, Heise Zeitschriften Verlag; ehemals Competence Center Hardware/Linux-Magazin, Linux New Media AG


Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...