12.8 Bedingte Anweisungen und Schleifen
12.8.1 if
Selbstverständlich kennt die C-Shell bedingte Anweisungen wie if sowie Schleifen wie while. Bei der Verwendung dieser Anweisungen unterscheidet sich die Syntax erneut von jener der Bourne-Shell. Beginnen wir zunächst bei der normalen bedingten Anweisung if. Deren Syntax sieht folgendermaßen aus:
Listing 12.16 Die if-Anweisung
if (Bedingung(en)) then
Kommandos
else if (Alternative Bedingung(en))
Kommandos
else
Kommandos
endif
Auf den ersten Blick erkennen Sie als aufmerksamer Leser, dass die C-Shell runde, die Bourne-Shell hingegen eckige Klammern verwendet. Als zweites fällt auf, dass die if-Anweisung nicht mit fi, sondern mit endif abgeschlossen wird.
Geben Sie eine mehrzeilige C-Shell-Anweisung direkt ein, ist es etwas verwirrend, zwischenzeitlich den %-Prompt zu sehen, lassen Sie sich dadurch also nicht irritieren.
Listing 12.17 Anwendung der if-Anweisung (direkt eingegeben)
% 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
%
12.8.2 Bedingungen formulieren
Wenn Sie bereits wissen, wie Bedingungen in Programmiersprachen formuliert werden, können Sie dies auch in der C-Shell – Bedingungen sind dort beispielsweise denen 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.
Listing 12.18 Beispiel-Bedingungen für die if-Anweisung
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
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 |
Datei ist eine 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. |
Listing 12.19 Einige Beispielanwendungen für Datei-Attribute
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
12.8.3 while-Schleifen
Die while-Schleife hat einen ähnlichen Aufbau wie if und führt die entsprechenden Anweisungen so oft aus, wie ihre Bedingung erfüllt ist. Sie kennen sie aus dem Kapitel zur Bourne-Shell-Programmierung.
Listing 12.20 Syntax der while-Schleife in der C-Shell
Listing 12.21 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
12.8.4 foreach-Schleifen
Neben while kennt die C-Shell noch eine weitere Schleife zur Verarbeitung von Listen. Sie heißt foreach und hat eine ähnliche Funktion und Syntax, wie Sie Ihnen bereits von der for-Schleife der Bourne-Shell bekannt ist.
Listing 12.22 Syntax der foreach-Schleife in der C-Shell
foreach Variable (Liste)
Kommandos
end
Die einzelnen Werte von 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 foreach-Schleife berechnet die Anzahl der Dateien im Verzeichnis /etc (ohne Dateien der Unterverzeichnisse):
Listing 12.23 Dateien in /etc zählen (Variante 1)
@ i = 0
foreach datei (/etc/*)
@ i ++
end
echo "Es gibt $i Dateien in /etc"
Auch eine Kommandosubstitution ist bei Bedingungen in der C-Shell möglich. So können wir etwa find nutzen, um alle Dateien im Verzeichnis /etc inklusive der Unterverzeichnisse zu zählen.
Listing 12.24 Dateien in /etc zählen (Variante 2)
@ i = 0
foreach datei (`find /etc`)
@ i ++
end
echo "Es gibt $i Dateien in /etc"
[»]Ü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 switch
Auch die switch-Anweisung, die in der Bourne- Shell case heißt, ist Ihnen bereits bekannt. Man übergibt ihr einen Wert und verschiedene möglicherweise zutreffende Fälle sowie im entsprechenden Fall auszuführende Bedingungen.
Listing 12.25 Syntax der switch-Anweisung in der C-Shell
switch (Wert)
case Fall1:
Kommandos
breaksw
case Fall2:
Kommandos
breaksw
..
default:
Kommandos
breaksw
endsw
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:
Listing 12.26 Anwendungsbeispiel für die switch-Anweisung
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
Reguläre Ausdrücke und Strings
Auch Strings und reguläre Ausdrücke können für case-Fälle verwendet werden, so können Sie etwa case [cC]harlie schreiben.
Listing 12.27 switch mit regulären Ausdrücken
switch ($katze)
case [mM]auzi:
echo "Mauzi hat das schoenste Fell!"
breaksw
case [cC]harl*:
echo "Charlie frisst zu viel!"
breaksw
endsw
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.