Next: Schleifen
Up: shell
Previous: Eingebaute und wichtige Kommandos
Unterabschnitte
Die Struktur von if
-Abfragen sieht so aus:
if cond1
then tu_was
[ elif cond2
then tu_was_anderes ]
[ else tu_noch_was ]
fi
if [ "$allesok" ] ; then tu_irgendwas; fi
ist äquivalent zu
[ "$allesok" ] && tu_irgendwas
oder [ ! "$allesok" ] || tu_irgendwas
, das if
ist aber langsamer, da es noch zusätzlich zum test
ausgewertet werden muß.
Da Klammern aller Arten schon zu anderen Zwecken benutzt werden, wird fi
benutzt, um das
Ende einer if
-Klausel anzuzeigen.
Mit elif
kann man if
-Klauseln ineinander verschachteln, muß die if
-Klausel
aber nur mit einem fi
beenden!
[britta@Wintermute shell]$ cat whichday
set `date`
if [ "$1" = "Sat" -o "$1" = "sun" ]
then
echo "Es ist Wochenende..."
else
echo "Heute ist $1."
echo "Viel Spass beim Arbeiten!!!"
fi
[britta@Wintermute shell]$ whichday
Es ist Wochenende...
[britta@Wintermute shell] $cat sysname
set `uname -a`
os="$1"
kernel="$3"
shift 2
cpu="$9"
if [ "$os" = "Linux" ]
then
echo Noch ein Linuxbenutzer!
echo netter Kernel, "$kernel"
elif [ "$cpu" = "alpha" ]
then
echo Ich will auch einen alpha!
echo Hast Du´s gut mit deinem "$os" ?
else
echo Also einen"$cpu" mit "$os" hast du!
echo Gibt´s nicht schon einen neuere Version als "$kernel" ?
fi
[britta@Wintermute shell] $sysname
Noch ein Linuxbenutzer!
netter Kernel, 2.2.9
case
ist ein mächtiges Konstrukt: es kann verschiedene Kommandos abhängig vom Wert einer
Variable ausführen, ähnlich wie switch, case
in C, allerdings benutzt es bei den
verschiedenen Fällen das Pattern-Matching der Shell. Wenn man also String-Werte in den Bedingungen
abfragt (z.B. bei Kommandozeilenparametern), ist case
billiger (und auch lesbarer) als
(u. U. verschachtelte) if
-Zweige.
Die Syntax ist folgendermaßen:
case var in
[ pat1 [ | pat2 ] ... ) tu_dies ;; ] ...
esac
Die letzte Zeile ist nicht nötig, aber immer gut, um nicht matchende Fälle aufzusammeln
(default
in C).
An der Pattern-Stelle kann man mit *, ?, [...]
die üblichen Shell-Wildcards benutzen.
[britta@Wintermute shell]$ cat weekday
#Deutsch/Englisch "portables" Wochentagsprogramm... :)
set `date`
case "$1" in
Mon) /usr/games/fortune ;; #montags ein fortune
Tue|Die) updatedb ;; #dienstags locate updaten
Wed|Mit) mail -s "Heute ist Mittwoch" root ;; #Account gefaehrden...
Thu|Don) echo "Bald ist Wochenende !!!" ;; #Freude
Fr[ei]) if [ "$3" -eq 13 ] #ist es der 13. ?
then
echo Heute ist Freitag der dreizehnte... viel Glueck!
fi ;;
*) echo "Wochenende!!!!" ;; #nix zu tun
esac
[britta@Wintermute shell]$ weekday
Wochenende!!!!
Next: Schleifen
Up: shell
Previous: Eingebaute und wichtige Kommandos
Britta Koch
1999-06-18