Das Programmieren von Shell-Skripten ist keine Hexerei. Schon mit wenigen Grundkenntnissen sparen Sie durch das Automatisieren alltäglicher Aufgaben viel Zeit.
README
Die Bourne-Again-Shell (Bash) hilft bei vielen kleinen und großen Aufgaben. Wenn Sie ein paar einfache Kniffe beherrschen und die richtigen Konstrukte kennen, sparen Sie viel Zeit und Mühe.
Shell-Skripte sind der beste Freund bequemer Menschen. Das mag seltsam klingen, denn das Schreiben eines Shell-Skripts setzt Können und Arbeit voraus, stimmt aber trotzdem: Schreiben Sie ein Shell-Skript zum Erledigen von sich wiederholenden Aufgaben, rentiert sich die investierte Zeit in der Zukunft mehrfach. Außerdem stellt das Schreiben eines Shell-Skripts eine Herausforderung dar, die viel Freude macht.
Dieser Artikel fasst die Grundlagen zum Schreiben von Shell-Skripten mit Bash im Kontext einiger allgemeiner Aufgaben zusammen. Dabei erhalten Sie die wichtigsten Informationen, um gleich mit dem Schreiben eigener Skripte zu beginnen. Eine kurze Zusammenfassung der behandelten Kommandos und Optionen finden Sie in der Tabelle “Schnellübersicht” am Ende des Artikels.
Hallo Bash!
In der einfachsten Form besteht ein Shell-Skript nur aus einer Datei mit einer Liste von auszuführenden Befehlen. Das folgende Skript führt beispielsweise einen langen Tar-Befehl aus, um ein Backup von Bilddateien zu erstellen:
#!/bin/bash tar cvzf /save/pix.tgz /home/chavez/pix /graphics/rdc /new/pix/rachel
Das Skript beginnt mit einer speziellen Zeile, die die Datei selbst als Skript identifiziert. Die Kombination #! heißt “Shebang”, darauf folgt der vollständige Dateipfad zur entsprechenden Shell. Der Shebang #!/bin/bash ruft ausdrücklich die Bourne-Again-Shell zum Ausführen des Skripts auf. Verwenden Sie das allgemeinere #!/bin/sh, kommt die Standard-Shell des Systems zum Zug, auf die der Symlink /bin/sh verweist – unter Ubuntu ist das beispielsweise die schlanke, weitgehend zur Bash kompatible Dash. Sie können die Ausführung aber auch einem anderen Programm übertragen: Der Shebang #!/bin/cat etwa führt dazu, dass das entsprechende Programm den Inhalt des “Skripts” auf der Konsole ausgibt.
Damit die Shell das Skript als ausführbare Datei erkennt, setzen Sie zunächst die Ausführungsrechte entsprechend. Heißt die Datei zum Beispiel mytar, erledigen Sie das mit dem Befehl chmod u+x mytar – vorausgesetzt, die Datei liegt im aktuellen Verzeichnis.
Der Rest des Skripts nach dem Shebang besteht aus dem Tar-Befehl mit den zu verarbeitenden Pfaden und Dateinamen. Der folgende Befehl führt das Skript aus, worauf einige Meldungen von Tar folgen:
$ ./mytar
Damit haben Sie die Anzahl der Anschläge, die zum Erzeugen eines Archivs nötig sind, von etwa 75 Zeichen auf 8 Zeichen reduziert. Allerdings ließe sich das Skript noch etwas allgemeiner – und damit nützlicher – gestalten, indem Sie die zu archivierenden Dateien in der Kommandozeile angeben:
$ ./mytar /home/chavez /new/pix/rachel /jobs/proj5
Mit diesem Befehl archivieren Sie eine andere Gruppe von Dateien. Das modifizierte Skript sehen Sie in Listing 1.
Listing 1
#!/bin/bash if [ $# -gt 0 ]; then # mindestens ein Argument tar czf /save/mystuff.tgz $@ >/dev/null fi
Es gibt darin einige neue Features: Der Tar-Befehl verwendet jetzt Ein- und Ausgabeumleitung, um alle Meldungen zu unterdrücken, die sich nicht auf Fehler beziehen. Der Befehl befindet sich innerhalb einer If-Anweisung. Erweist sich die in eckigen Klammern angegebene Bedingung als wahr, arbeitet das Skript die darauffolgenden Befehle ab.
Es prüft, ob die Anzahl der Argumente zum Skript, die Sie in der Variable $# finden, höher als 0 liegt: Falls ja, hat der Benutzer einen oder mehrere Pfade fürs Archivieren angegeben. Fehlen die Parameter, gibt es nichts zu tun, der Befehl kommt also nicht zum Einsatz.
Ein weiterer Vorteil: Das Skript übergibt die Argumente, die es auf der Kommandozeile erhalten hat, mittels der speziellen Variable $@ an den Tar-Befehl. Diese Variable enthält die Liste der Argumente. Der Befehl aus unserem Beispiel sieht dann wie folgt aus:
tar czf /save/mystuff.tgz /home/chavez /new/pix/rachel /jobs/proj5 >/dev/null
Auch hier haben Sie wieder jede Menge Tipparbeit gespart – zwar nicht ganz so viel, wie in der ersten Version des Skripts, dafür arbeitet diese Variante aber wesentlich flexibler.
Eingabedatei
Mit der Methode in Listing 2 ändern Sie die Arbeitsweise des Skripts. Das erste Argument enthält nun eine Datei, die eine Liste der zu archivierenden Verzeichnisse enthält. Die übrigen Argumente behandelt das Skript als einzelne Elemente, die es ebenfalls verwendet – wieder in der schon bekannten Variable $@.


