Home · Kontakt · Impressum
contents index previous up next
Next: 15.3.4 case Up: 15.3 Grundstrukturen Previous: 15.3.2 test


15.3.3 if ... then ... elif ... then ... else ... fi

Mit dem Befehl if und seinen Unterbefehlen, kann ein Skript aufgrund der Fakten Entscheidungen treffen. Unser Skript tohtml hat noch ein paar Schwächen. So kommt es zu Fehlermeldungen von sed, wenn ein nichtvorhandene oder nicht lesbare Datei vorliegt. Deshalb soll in Zukunft vor der Ausführung überprüft werden, ob die angegebene Datei lesbar ist. Trifft dies nicht zu, wird eine Fehlermeldung ausgegeben.

Listing 15.5   tohtml Version 3

   1: #!/bin/bash
   2: 
   3: # Gibt ein Skript als zeilennummerierte HTML-Datei zurück
   4: #   tohtml SKRIPTNAME
   5: 
   6: # Existiert die Ausgabedatei ?
   7: if [ -r $1 ]
   8: then
   9:   # Name der Ausgabedatei
  10:   out="$1.html"
  11: 
  12:   # Lege den Anfang der HTML-Datei an
  13:   echo -e "<html>\n<head>\n<title>$1</title>\n</head>\n<body>\n" > $out
  14:   echo -e "<h1 align='center'>Listing: $1</h1>\n<pre>" >> $out
  15: 
  16:   # Datei durchnummerieren und spitze Klammern behandeln
  17:   sed "s/</\&lt;/g" $1 | sed "s/>/\&gt;/g" \
  18:     | expand | nl -w 4 -b a -s ": " >> $out
  19: 
  20:   # Ende der HTML-Datei
  21:   echo -e "</pre>\n</body>\n</html>\n" >> $out
  22: else
  23:   # Existiert die Datei oder ist sie nur nicht lesbar? 
  24:   if [ -e $1 ]
  25:   then
  26:     # Fehlerausgabe auf Fehlerkanal
  27:     echo "Die Datei $1 ist nicht lesbar." > /dev/stderr
  28:     exit 1      # Beenden mit Fehlercode        
  29:   else
  30:     # Fehlerausgabe auf Fehlerkanal
  31:     echo "Die Datei $1 existiert nicht." > /dev/stderr
  32:     exit 2      # Beenden mit Fehlercode
  33:   fi
  34: fi

Das Skript ist durch die Struktur if ... else in zwei Teile aufgeteilt. Der erste Teil wird ausgeführt, wenn die Datei lesbar ist. Wenn Sie nicht lesbar ist, wird der zweite Teil nach dem else ausgeführt.

Die Anweisungen nach dem then werden nur ausgeführt, wenn der Ausdruck hinter dem if wahr ist. Optional kann nach diesen Anweisungen noch ein else erscheinen, das einen zweiten Anweisungsblock einleitet. Diese Anweisungsblock wird nur dann ausgeführt, wenn der Ausdruck hinter dem if falsch ist.

Im zweiten Anweisungsblock wird noch unterschieden, ob die Datei nur nicht lesbar ist oder sie gar nicht existiert. Die Meldungen werden auf dem Fehlerausgabe ausgegeben, die normalerweise wie die Standardausgabe auf das ausführende Terminal zeigt. Danach wird das Skript mit unterschiedlichen Fehlercodes beendet. Dieses Verhalten können Sie im folgenden Beispiel sehen.

ole@enterprise:~/test> tohtml /etc/shadow ; echo $?
Die Datei /etc/shadow ist nicht lesbar.
1
ole@enterprise:~/test> tohtml blubb ; echo $?
Die Datei blubb existiert nicht.
2
ole@enterprise:~/test> tohtml shebang ; echo $?
0
ole@enterprise:~/test>

Weitere Entscheidungsblöcke mit eigenen Testausdrücken können vor dem else eingefügt werden, um noch feinere Entscheidungen treffen zu können. So liest das Skript, wenn kein Parameter eingegeben wurde, direkt von der Konsole seine Daten. Dies soll nicht geschehen, sondern in diesem Fall und wenn mehr als ein Parameter eingegeben wurde, soll das Skript einen Hilfetext ausgeben.

Listing 15.6   tohtml Version 4

   1: #!/bin/bash
   2: 
   3: # Gibt ein Skript als zeilennummerierte HTML-Datei zurück
   4: #   tohtml SKRIPTNAME
   5: 
   6: # Stimmt die Parameteranzahl nicht, dann Hilfetext
   7: if [ $# -ne 1 ]
   8: then
   9:   echo "tohtml - Erzeugt von Dateien Listings im HTML-Format" > /dev/stderr
  10:   echo "  Anwendung:" > /dev/stderr
  11:   echo "      tohtml DATEINAME" > /dev/stderr
  12:   exit 3        # Fehlercode ausgeben
  13: # Existiert die Ausgabedatei ?
  14: elif [ -r $1 ]
  15: then
  16:   # Name der Ausgabedatei
      ...
  28:   echo -e "</pre>\n</body>\n</html>\n" >> $out
  29: else
  30:   # Existiert die Datei oder ist sie nur nicht lesbar? 
      ...
  40:   fi
  41: fi

Das Skript ist jetzt in drei Teile aufgeteilt. Der erste Teil wird ausgeführt, wenn mehr oder weniger als ein Parameter angegeben wurde. Es wird ein Hilfetext ausgegeben. Der zweite Teil wird nur ausgeführt, wenn ein Parameter angegeben wurde und der Parameter eine lesbare Datei bezeichnet. Trifft dies auch nicht zu, dann wird erst der letzte Teil nach dem else ausgeführt und die Fehlermeldungen erscheinen. Im Listing sind die Anweisungsblöcke der Teile Zwei und Drei nicht angegeben, da sie mit dem vorherigen Skript identisch sind.

Sie können in eine if Struktur so viele elif ... then ... Anweisungen einbauen, wie sie wollen.

ole@enterprise:~/test> tohtml
tohtml - Erzeugt von Dateien Listings im HTML-Format
  Anwendung:
      tohtml DATEINAME

Noch einmal übersichtlich dargestellt sieht die ganze Konstruktion so aus, wobei die elif ... then beliebig oft vorkommen können.

if AUSDRUCK1
then
  ...
elif AUSDRUCK2
then
  ...
elif AUSDRUCK3
then 
  ...
else 
  ...
fi


contents index previous up next
Next: 15.3.4 case Up: 15.3 Grundstrukturen Previous: 15.3.2 test
  © 2004 by IT-Dozent Ole Vanhoefer · Zum Seitenanfang