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
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 # successEine 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.