Mit der Shell sind sowohl einfache als auch komplexe Konstruktionen wie Schleifen, Bedingungen oder Verzweigungen wie bei anderen Programmiersprachen möglich. Diese können auf der Kommandozeile ausgeführt oder in Dateien geschrieben und abgearbeitet werden (vgl. Batchdateien unter DOS). Um ein Shellskript ausführen zu können, muß entweder die Datei lesbar sein und mit
$ sh Skript
explizit der jeweiligen Shell zur Bearbeitung vorgelegt werden. Eine andere Möglichkeit ist es, in die erste Zeile des Skriptes
#! /bin/sh
zu schreiben und die Datei mit chmod ausführbar zu machen. Das Skript kann dann wie jeder andere Befehl direkt aufgerufen werden.
Im Skript können jede Art von Kommandos stehen, wie sie auch von der Befehlszeile aus gestartet würden. Sie stehen jeweils für sich in einer Zeile und werden entsprechend nacheinander abgearbeitet. Wenn die Ausgabe eines Kommandos als Eingabe für den nächsten dienen soll, ist dies wie gewohnt mit Pipes zu realisieren.
Das Hash-Zeichen # zu Beginn einer Zeile leitet Kommentare ein, so daß der Rest der Zeile von der Shell ignoriert wird.
Das folgende Skript ist ein einfaches Beispiel für die Anwendung der Programmierung mit der Shell-Syntax :
#!/bin/sh # # Add numerical Arguments and print sum # sum=0 while [ 0 ]; do if [ $# -gt 0 ]; then sum=`expr $sum + $1 ` shift 1 continue else echo "$sum" exit 0 fi done
Zu Beginn wird der Variablen sum der Wert Null zugewiesen. In der folgenden Schleife von while bis done wird die Anwesenheit von weiteren Argumenten auf der Kommandozeile geprüft, um sie danach zu addieren. (Dabei wird vorausgesetzt, daß es sich um numerische Argumente handelt. Die Angabe von nicht-numerischen Argumenten führt zu einer Fehlermeldung der Shell. Wie könnte die Art der Argumente geprüft werden?)
In der IF-Anweisung wird überprüft, ob die Summe der Argumente größergleich Null ist. Trifft dies zu, ist zum Wert von sum der Wert des ersten Argumentes zu addieren. Die Anweisung shift 1 bewirkt, daß das folgende Argument als neues erstes Argument betrachtet wird. continue läßt die Schleife erneut durchlaufen.
Falls die Summe der Argumente nicht mehr größergleich Null ist ( else), wird der Wert von sum ausgegeben. Die anschließende Anweisung exit 0 liefert den Fehlercode Null (fi = Ende der IF-Anweisung) und damit die Abbruchbedingung für die Schleife (done).
Um der besseren Übersichtlichkeit willen können die Anfangs- und Endschlüsselwörter von Schleifen (while, done) und Bedingungen (if, then, else, fi) auch durch Leerzeichen oder Tabs eingerückt werden. Die Shell ignoriert diese ,,white spaces`` und so kann durch die unterschiedliche Schachteltiefe anschaulicher Code erzeugt werden.
Ein weiteres Beispiel ist das folgende Skript, welches automatisch die Verbindung zu einem FTP-Server aufbaut, sich einloggt, in die vorgegebenen Verzeichnisse wechselt und entsprechende Dateien herunterlädt.
#! /bin/sh # ftp -n ftp.irgendein.server.sonstwo << ! user anonymous -[eigene EMailadresse] cd pub cd Linux cd kernel cd v2.0 bin get linux-2.0.24.tar.gz quit !
Die Option -n fordert ftp auf, sich nicht automatisch auf dem entfernten Server einzuloggen und dazu ein eventuell vorhandenes .netrc-File auszuwerten, sondern explizit Username und Passwort abzufragen. Die beiden << teilen ftp mit, daß es bis Auftauchen eines Ausrufezeichens ! die folgenden Befehle von der Eingabe abarbeiten soll.
Natürlich muß statt ftp.irgendein.server.sonstwo ein gültiger Servername eingesetzt werden. Die Zeichenfolge user anonymous leitet dann eine ,,anonyme FTP-Sitzung`` ein . Statt [eigene EMailadresse] ist natürlich ebendiese (ohne die eckigen Klammern!) einzugeben, also z. B. arthur@trillian.universe.edu. Sie dient als Paßwort beim Login einer anonymen FTP-Sitzung (s. Kap. 11.2). Das Minuszeichen davor (ohne Leerzeichen!) veranlaßt den entfernten FTP-Server, nicht die sonst übliche Willkommensmeldung auszugeben. Sie könnte unter Umständen den Batchbetrieb stören. Die folgenden cd-Befehle setzen natürlich voraus, daß die Anwenderin den genauen Pfad zur gewünschten Datei auf dem FTP-Server kennt.
Ein sinnvoller Einsatz dieses Skriptes könnte z. B. darin liegen, die FTP-Sitzung in den betriebsarmen Nachtstunden automatisch ablaufen zu lassen. Dazu muß das Skript zum Beispiel durch einen crontab-Eintrag zur entsprechenden Eintrag aufgerufen werden. Falls der Systemadministrator keine Benutzer-crontabs zuläßt, kann die FTP-Sitzung trotzdem automatisiert ablaufen. Dazu ist:
nohup gibt eine Statusmeldung aus. Durch einen Druck auf RETURN erhält man seinen Prompt wieder. Anschließend kann die Sitzung auf dem Unix-Server normal beendet werden, ohne das ,,schlafende`` Skript abzubrechen. Um 15 Uhr aufgerufen, wird ein sleep 36000 das Skript um 1 Uhr aufwachen lassen und die FTP-Sitzung beginnen. Am nächsten Morgen eingeloggt, findet man die gewünschten Dateien in seinem HOME-Verzeichnis vor.