Bedingte Anweisungen werden bei der Shell-Programmierung verwendet. Sie liefern
einen Status zurück, der idR zur Steuerung des Scripts verwendet wird.
Die erste Zeile im Script legt den Commandinterpreter (Shell) fest.
Achtung: #! in Spalte 1 ist hierbei zwingend und kein Kommentar
- #!/bin/sh
Bourne SHell -
- /bin/ksh
Korn SHell
- #!/bin/bash
Bourne Again SHell. Systenscripts in /etc/init.d verwenden #!/bin/bash
Ausdruck testen
test ausdruck (alte Form)
[ ausdruck ] (neue Form System V)
[[ ausdruck ]] (neue Form ksh , bash)
Das Kommando test wird verwendet, um einen Ausdruck zu testen.
Es liefert als Ergebnis einen Status zurück :
für TRUE eine 0
für FALSE einen Wert ungleich 0
Wird test ohne Argument aufgerufen, so wird FALSE zurückgeliefert.
Logische Operatoren
! ausdruck Negiert das Ergebnis von ausdruck
ausdr -a ausdr verbindet die Ergebnisse von ausdr mit logisch AND
ausdr -o ausdr verbindet die Ergebnisse von ausdr mit logisch OR
(AND wird vor OR verknüpft)
Es dürfen Klammern gesetzt werden. Dabei ist zu beachten, daß Klammern für die Shell eine Bedeutung haben, d.h sie sind evtl durch einen Backslash zu quoten \( expr \).
Für den Vergleich von numerischen Werten sollten immer die entsprechenden Options verwendet werden und nicht < <= = != >= > da f�hrende Nullen das Ergebnis verf�lschen k�nnten.
Bourne-Shell neue Form ab System V
[ ausdruck ] kann statt test ausdruck verwendet werden.
Achtung : die Klammern [ ] müssen in Blanks eingeschlossen sein.
Die ksh und die bash verwenden [[ ausdruck ]] für den test
i=003
j=3
[[ $j != $i ]] && print $j ungleich $i
[[ j -eq i ]]
if
if kommandofolge_1
then kommandofolge_2
[ elif kommandofolge_3 ]
[ else kommandofolge_4 ]
fi
Im Gegensatz zu Programmiersprachen kann hier eine Kommandofolge als Bedingung
verwendet werden. Sie gilt als erfüllt, wenn sie 0 als Ergebnis zurückliefert.
Natürlich wird häufig auch hier nur eine Bedingung formuliert werden, da sonst
der Exit-Status der letzten Anweisung den Ausschlag gibt.
#typeset -u antw (geht nur in ksh nicht in bash, wandelt Eingabe in uppercase)
read antw?"Datei löschen (J/ ) ? "
if [ $antw = "J" -o $antw = "j" ]
then
if [ ! -r $fln ]
then
echo "Datei $fln fehlt"
else
rm $fln
fi
fi
Beispiel 2 :
#! /bin/ksh
#
if [ $# -eq 0 ]
then
echo "Aufruf : "
echo " copy source dest "
read src?"Bitte Sourcedatei eingeben "
read dest?"Bitte Zieldatei eingeben "
elif [ $# -eq 1 ]
then
read dest?"Bitte Zieldatei eingeben "
src=$1 # Parameter umspeichern
elif test $# -eq 2
then
src=$1 # Parameter umspeichern
dest=$2
else
echo "Zuviel Parameter"
exit 1 # Abbruch mit Fehlerexit
fi
cp $src $dest
exit 0 # success
Eine einfache IF-Konstruktion kann mit Hilfe der Zeichen && oder || kürzer
dargestellt werden.
kommandoliste_1 && kommandoliste_2
Bei && wird kommandoliste_2 nur ausgeführt, wenn kommandoliste_1 einen Status 0
d.h. TRUE zurückgeliefert hat.
#typeset -u antw
read antw& "Datei löschen (J/ ) ? "
[[ $antw = "J" ]] && rm "$fln"
Anderer Anwendungsfall, Umwandlung mit nachgeschaltetem Link.
Bei || wird kommandoliste_2 nur ausgeführt, wenn kommandoliste_1 einen Status
ungleich 0 d.h. FALSE zurückgeliefert hat.
troff -ms text 2>fehler || rm text.out*
Die Datei Text soll mit dem Formatierer troff und dem Macro ms formatiert werden.
Dabei werden die Dateien text.out und text.out_ erzeugt. Wenn bei der Formatierung
ein Fehler auftritt, so sollen diese beiden Dateien gelöscht werden.