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.
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/</\</g" $1 | sed "s/>/\>/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.
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