8    Eigene Shellskripte entwickeln

»Everyone knows that debugging is twice as hard as writing
a program in the first place. So if you're as clever as you
can be when you write it, how will you ever debug it?«
(Dt. »Jedem ist bekannt, dass Debugging doppelt so schwierig
wie Programmierung ist. Wenn Sie also Ihre ganze Intelligenz
zum Programmieren nutzen, wie sollen Sie den Code später debuggen?«)
– Brian W. Kernighan

Herzlichen Glückwunsch! Sie sind nun bereits in einem fortgeschrittenen Kapitel des Buches angelangt. Die Shell kennen Sie bereits aus Kapitel 4, »Grundlagen der Shell«. Sie ist das A und O unter Linux und wird Ihnen wohl auch in den nächsten Jahren der Linux-Nutzung Gesellschaft leisten. In diesem Kapitel möchten wir Ihr Wissen über die Shell vertiefen.

8.1    Grundlagen der Shellskript-Programmierung

Sofern Sie nach dem obigen Stoff eine kleine Lernpause benötigen, gönnen Sie sich diese. Das nun folgende Thema ist etwas anspruchsvoller und sollte daher mit voller Aufmerksamkeit studiert werden – es lohnt sich! Die Programmierung von Shellskripten ist in der Linux-Welt ein wichtiges Mittel zur Administration von Systemen.

Zunächst werden wir uns mit den grundlegenden Dingen der Shellskripte beschäftigen. Anschließend werden wir Schleifen, Arrays und bedingte Anweisungen erläutern. Am Ende des Kapitels sollten Sie ohne größere Probleme ein Backup-Skript für Ihren Server erstellen können.

8.1.1    Was genau ist ein Shellskript?

Ein Shellskript ist zunächst einmal eine Datei. In dieser Datei ist mindestens ein Shellkommando enthalten. Die in der Datei enthaltenen Kommandos werden der Reihe nach von der Shell ausgeführt.

Damit solch ein Shellskript überhaupt ausführbar wird, sollten Sie es mit den entsprechenden Rechten versehen. Als Programmierer benötigen Sie Lese-, Schreib- und Ausführungszugriff für ein Skript. Die anderen Benutzer des Systems sollten nicht unbedingt Zugriff auf solche Skripte haben.

user$ touch Skript.sh
user$ chown user:users Skript.sh
user$ chmod 0700 Skript.sh

Listing 8.1     Shellskript-Permissions setzen

Ein Shellskript wird ausgeführt, indem man es wie ein normales Programm aufruft. Dabei ist zu beachten, dass sich das Skript in einem bin-Verzeichnis wie etwa /usr/local/bin befinden und dieses Verzeichnis in der PATH-Variablen enthalten sein muss. Natürlich kann ein Skript auch im Arbeitsverzeichnis ausgeführt werden. Dazu muss dieses allerdings explizit angegeben werden:

user$ ./Skript.sh
--- Ausgaben des Skripts ---

Listing 8.2     Ausführen eines Skripts

Wie legen Sie los?

Als Erstes benötigen Sie einen Editor. Am einfachsten sind grafische Lösungen wie gedit zu bedienen. Auf der Konsole eignen sich der vi- bzw. vim-Editor und nano. In den Editor geben Sie die Anweisungen des Skripts ein und speichern sie ab. Anschließend setzen Sie noch die obigen Zugriffsrechte, und fertig ist das erste Shellskript.

Ein Shellskript beginnt ordnungsgemäß mit der folgenden Zeile: #!<Pfad zum Interpreter>. Also zum Beispiel:

#!/bin/sh

Listing 8.3     Interpreterangabe

Dies hat den einfachen Grund, dass der Kernel sich die ersten zwei Zeichen einer auszuführenden Datei anschaut. Handelt es sich dabei um die Zeichen #!, so bedeutet dies, dass für die Ausführung der Datei ein sogenannter Interpreter benötigt wird. Ein Interpreter ist ein Programm, das in der Lage ist, diese Anweisungen zu verstehen und zu verarbeiten. Im Fall der Shellskript-Programmierung mit der Bourne-Shell wäre das beispielsweise die Bourne-Shell selbst. Der Pfad dieser Shell ist /bin/sh. Ein weiteres Beispiel wäre ein Python-Skript. Der entsprechende Interpreter ist in diesem Fall /usr/bin/python.

8.1.2    Das erste Shellskript

Es ist nun an der Zeit, die Theorie in die Praxis zu portieren. Unser erstes Shellskript wird nur eine einfache Meldung, nämlich »Hello World!«, auf dem Bildschirm ausgeben.

user$ cat hello.sh
#!/bin/sh

echo "Hello World!"
user$ chmod +x hello.sh # Ausführrecht setzen

user$ ./hello.sh
Hello World!

Listing 8.4     hello.sh

8.1.3    Kommentare

Wie jede gute Programmiersprache bietet auch die Shell die Möglichkeit, Kommentare im Quelltext zu platzieren. Besonders in großen Skripten ist es manchmal sehr praktisch, einige Hinweise an sich selbst zu richten, falls man später noch durch den Code durchblicken möchte.

In Shellskripten werden Kommentare mit einer Raute (#) eingeleitet. Alles, was hinter solch einer Raute steht, wird bis zum Ende der Zeile als Kommentar gewertet. Daher kann auch direkt hinter einer Anweisung ein Kommentar eingefügt werden:

#!/bin/sh

echo "Hello World!" # Meldung ausgeben
echo                # Eine freie Zeile ausgeben

Listing 8.5     hello2.sh