12.8 Bedingte Anweisungen und Schleifen 

12.8.1 Die if-Anweisung 

Selbstverständlich kennt die C-Shell bedingte Anweisungen wie if sowie Schleifen wie while. Bei der Verwendung dieser Anweisungen unterscheidet sich die Syntax der C-Shell erneut von der Syntax der Bourne-Shell. Beginnen wir zunächst bei der normalen bedingten Anweisung if. Die Syntax von if sieht folgendermaßen aus:
if (Bedingung(en)) then Kommandos else if (Alternative Bedingung(en)) Kommandos else Kommandos endif
Listing 12.16 Die if-Anweisung
Auf den ersten Blick erkennen Sie als aufmerksamer Leser, dass die C-Shell runde Klammern verwendet, während die Bourne-Shell eckige Klammern verwendet. Als zweites fällt auf, dass die if-Anweisung nicht mit fi, sondern mit endif abgeschlossen wird.
Geben Sie eine C-Shell-Anweisung direkt ein, ist es etwas verwirrend, zwischenzeitlich den %-Prompt zu sehen, lassen Sie sich dadurch also nicht irritieren.
% set a=1 % echo $a 1 % if (${a} == "1") then % echo "a ist 1" a ist 1 % endif % if (${a} == "99") then ? echo "a ist 99" ? else % % echo "a ist nicht 99!" a ist nicht 99! % endif %
Listing 12.17 Anwendung der if-Anweisung (direkt eingegeben)
12.8.2 Bedingungen formulieren 

Wenn Sie bereits wissen, wie Bedingungen in Programmiersprachen formuliert werden, können Sie auch Bedingungen in der C-Shell formulieren – sie sind beispielsweise der Programmiersprache C ähnlich. Ihnen stehen etwa die Operatoren && und ||, die wir im Kapitel zur C-Programmierung noch einmal näher erläutern werden, zur Verfügung.
if ($a == 1 && $b == 2) ... endif if ($a == 1 || $a == 2) ... endif if ($a > 1) ... endif if ($b >= 2) ... endif if ($a == 0) then echo "a ist 0" else if ($a == 1) then echo "a ist 1" else echo "a ist nicht 0 und nicht 1" endif
Listing 12.18 Beispiel-Bedingungen für die if-Anweisung
Außerdem können Sie, ähnlich wie in der Bourne-Shell, Prüfungen für verschiedene Attribute von Dateien durchführen, wie die folgende Tabelle zeigt.
Operator | Beschreibung |
-d |
Datei ist ein Verzeichnis. |
-e |
Datei existiert. |
-f |
reguläre Datei |
-z |
Datei ist leer. |
-o |
Datei gehört dem Benutzer. |
-r |
Datei ist lesbar. |
-w |
Datei ist schreibbar. |
-x |
Datei ist ausführbar. |
if (-d /tmp) then echo "/tmp ist ein Verzeichnis" endif if (-e /gibtsnicht) then echo "/gibtsnicht existiert" else echo "/gibtsnicht existiert nicht" endif if (-o $HOME) then echo "$HOME gehoert dem Benutzer $USER" endif
Listing 12.19 Einige Beispielanwendungen für Datei-Attribute
12.8.3 Die while-Schleife 

Die while-Schleife hat einen ähnlichen Aufbau wie die if-Anweisung und führt die entsprechenden Bedingungen so oft aus, wie ihre Bedingung erfüllt ist. Sie kennen die while-Schleife aus dem Kapitel zur Bourne-Shell-Programmierung und zu C und Perl.
while (Bedingung(en)) Kommandos end [Beispielanwendung der while-Schleife] % @ i = 0 % while ($i < 10) ? @ i ++ ? echo $i ? end 1 2 3 4 5 6 7 8 9 10
Listing 12.20 Syntax der while-Schleife in der C-Shell
12.8.4 Die foreach-Schleife 

Neben der while-Schleife kennt die C-Shell noch eine weitere Schleife zur Verarbeitung von Listen. Diese Schleife heißt foreach und hat eine ähnliche Funktion und Syntax, wie Sie Ihnen bereits aus der for-Schleife der Bourne-Shell bekannt ist.
foreach Variable (Liste) Kommandos end
Listing 12.21 Syntax der foreach-Schleife in der C-Shell
Die einzelnen Werte der Liste Liste werden dabei nacheinander (eine pro Schleifendurchlauf) der Variablen Variable zugewiesen. Auch für die foreach-Schleife haben wir selbstverständlich eine Beispielanwendung für Sie. Die folgende for- each-Schleife berechnet die Anzahl der Einträge in der Datei /etc/passwd (ohne Dateien der Unterverzeichnisse):
@ i = 0 foreach datei (/etc/*) @ i ++ end echo "Es gibt $i Dateien in /etc"
Listing 12.22 Dateien in /etc zählen (Variante 1)
Auch eine Kommandosubstitution ist für Bedingungen in der C-Shell möglich. So können wir etwa find nutzen, um alle Dateien im Verzeichnis /etc (nun inklusive der Unterverzeichnisse) zu zählen.
@ i = 0 foreach datei (`find /etc`) @ i ++ end echo "Es gibt $i Dateien in /etc"
Listing 12.23 Dateien in /etc zählen (Variante 2)
Üblicherweise werden Sie als normaler Benutzer (also ohne Superuser-Privilegien) einige Fehlermeldungen erhalten, wenn find versucht, Verzeichnisse zu durchsuchen, auf die nur root Zugriff hat. |
12.8.5 Die switch-Anweisung 

Auch die Ihnen ebenfalls bereits bekannte switch-Anweisung, die in der Bourne- Shell case heißt, ist Ihnen bereits bekannt. Dieser Anweisung übergibt man einen Wert und verschiedene möglicherweise zutreffende Fälle sowie im entsprechenden Fall auszuführende Bedingungen.
switch (Wert) case Fall1: Kommandos breaksw case Fall2: Kommandos breaksw .. default: Kommandos breaksw endsw
Listing 12.24 Syntax der switch-Anweisung in der C-Shell
Die einzelnen Fälle der switch-Anweisung werden mit breaksw (break switch) abgeschlossen. Fehlt breaksw, so werden die Kommandos des nächsten case-Blocks ebenfalls mit ausgeführt. Sollte kein explizit abgefragter Fall eintreten, so werden die Kommandos im Block default ausgeführt. Beendet wird die switch-Anweisung mit endsw. Ein Beispiel soll die Anwendung der switch-Anweisung in der C-Shell verdeutlichen:
switch ($a) case 0: echo "a ist 0" breaksw case 1: echo "a ist 1" breaksw default: echo "a ist nicht 0 oder 1" breaksw endsw
Listing 12.25 Anwendungsbeispiel für die switch-Anweisung
Reguläre Ausdrücke und Strings
Auch Strings und reguläre Ausdrücke können für case-Blöcke verwendet werden, so können Sie etwa case [cC]harlie schreiben.
switch ($katze) case [mM]auzi: echo "Mauzi hat das schoenste Fell!" breaksw case [cC]harl*: echo "Charlie frisst zu viel!" breaksw endsw
Listing 12.26 switch mit regulären Ausdrücken