Bedingte Anweisungen


Bedingte Anweisungen werden bei der Shell-Programmierung verwendet. Sie liefern
einen Status zurück, der idR zur Steuerung des Scripts verwendet wird.

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.