Linux-Praxisbuch/ Shellprogrammierung/ Aufbau eines Shell-Skriptes

Ein Shell-Skript ist eine Textdatei, die folgendes Grundgerüst hat. In der ersten Zeile steht die Angabe der Shell, dies kann alternativ auch eine andere Shell als die Bash sein. Danach kommen meist Kommentare, die Meta-Informationen über das Shell-Skript enthalten. Die hier getätigten Kommentare ($author, $date) haben nur einen Sinn, wenn diese von einem Versionierungssystem verwaltet werden. Dieses ersetzt automatisch die Tags mit deren entsprechenden Informationen. Darauf folgen die Befehle, die das Shell-Programm erst ausmachen.

#!/bin/bash
# comments
# Use CVS and Subversion-Tags Version-Control
# Author:  $author
# Last Modification: $date
# Purpose: describe the purpose

# your code comes here

HowTo Bearbeiten

Zunächst muss mit Hilfe des Editors eine Textdatei angelegt werden, in die der Quelltext geschrieben wird. Wie der aussieht, kann man anhand der folgenden Abschnitte und der Beispiele im Anhang erkennen. Beim Schreiben sollte man nicht mit Kommentaren geizen, da ein langes Shell-Skript sonst sehr unleserlich werden kann (was übrigens auch für alle anderen Programmiersprachen gilt).

Die Datei ist unter einem geeignetem Namen zu speichern. Bitte hierfür nicht den Namen test verwenden. Es existiert ein Unix-Systemkommando mit diesem Namen. Dieses steht fast immer vorher im Suchpfad, d.h. beim Kommando test würde nicht das eigene Skript ausgeführt, sondern das Systemkommando. Dies ist einer der häufigsten und zugleich einer der verwirrendsten Anfängerfehler. Mehr zu dem test-Kommando unter Bedingungen.

Danach muss sie ausführbar gemacht werden. Das geht mit dem Unix-Kommando chmod.

Rechte werden unter Unix getrennt für den Benutzer (user, u), die Gruppe (group, g) oder Andere (others, o) vergeben. Außerdem kann man die Rechte für Gruppen zusammen (all, a) setzen. Man kann getrennt die Rechte für das Lesen (read, r), das Schreiben (write, w) und die Ausführung (execution, x) einstellen. Um die Rechte zu setzen, muss man chmod in Parametern mitgeben, auf welche Gruppe sich das Kommando bezieht, ob das Recht gesetzt (+) oder weggenommen (-) werden soll, und welche Rechte gemeint sind. Damit alle Benutzer das Skript ausführen dürfen, benutzt man das Kommando chmod a+x name oder einfach chmod +x name. Mit chmod u+x name erhält nur der Besitzer der Datei Ausführungsrechte. Also z.B. chmod 755 /home/user/script.

Dann kann das Skript gestartet werden. Da sich aus Sicherheitsgründen auf den meisten Systemen das aktuelle Verzeichnis nicht im Suchpfad des Benutzers befindet, muss man der Shell mitteilen, wo sie zu suchen hat: Mit ./name wird versucht, im aktuellen Verzeichnis (./) ein Programm namens name auszuführen.

Auf den meisten Systemen befindet sich im Suchpfad der Eintrag ~/bin bzw. /home/benutzername/bin. Das bedeutet, dass man Skripts, die immer wieder benutzt werden sollen, dort ablegen kann, so dass sie auch ohne eine Pfadangabe gefunden werden. Wie der Suchpfad genau aussieht kann man an der Shell durch Eingabe von echo $PATH herausfinden.

Befehlsreferenz Bearbeiten

Ein sehr nützlicher Bestandteil eines GNU/Linux-Betriebssystems sind die man-Seiten, welche über Befehle Auskunft geben. Will man zum Beispiel mehr über den Befehl ls (steht für list und gibt die Dateien des gewünschten Verzeichnisses aus) erfahren, erreicht man das über die Kommandozeile mittels

$ man ls

Das Dollarzeichen wird als Prompt bezeichnet und steht, wenn die Shell auf eine Eingabe wartet, zu Beginn einer Zeile. Navigieren kann man hier mit der Eingabetaste, nur nach unten, Beenden des Handbuches mit q für quit.

In dem jeweiligen Handbuch, welches durchaus auch mal ziemlich umfangreich sein kann, wie etwa das zu der Skriptsprache Perl, erfährt man alles über die anzuwendende Syntax, die Optionen des Befehls, wann welcher Rückgabewert geschickt wird und vieles mehr.

Es gehört auch zum guten Ton, eine Manual-Seite zu schreiben, wenn man einen neuen Befehl, welcher für die Allgemeinheit nützlich ist, programmiert hat.

Rückgabewerte Bearbeiten

Wenn unter Unix ein Prozess beendet wird, gibt er einen Rückgabewert (auch Exit-Code oder Exit-Status genannt) an seinen aufrufenden Prozess zurück. So kann der Mutterprozess kontrollieren, ob die Ausführung des Tochterprozesses ohne Fehler beendet wurde. In einigen Fällen (z. B. grep) werden unterschiedliche Exit-Codes für unterschiedliche Ereignisse benutzt.

Dieser Rückgabewert wird bei der interaktiven Benutzung der Shell nur selten benutzt. Aber in der Programmierung von Shell-Skripten ist er von unschätzbarem Wert. So kann das Skript automatisch entscheiden, ob bestimmte Aktionen ausgeführt werden sollen, die von anderen Aktionen abhängen. Beispiele dazu sieht man bei der Beschreibung der Kommandos if, case, while und until, sowie in dem Abschnitt über Befehlsformen.

In der Bourne-Shell wird der Exit-Code des letzten aufgerufenen Programms in der Variable $? abgelegt. Üblicherweise geben Programme den Wert 0 zurück, bei irgendwelchen Problemen einen von 0 verschiedenen Wert. Das wird im folgenden Beispiel deutlich:

$ cp datei /tmp 
$ echo $? 
0
$ rm datei
$ cp datei /tmp 
cp: datei: Datei oder Verzeichnis nicht gefunden 
$ echo $? 
1 	

Normalerweise wird man den Exit-Code nicht in dieser Form abfragen. Sinnvoller ist folgendes Beispiel, in dem eine Datei erst gedruckt, und dann - falls der Ausdruck erfolgreich war - gelöscht wird:

$ lpr datei && rm datei 

Näheres zur Verknüpfung von Aufrufen steht im Kapitel über Befehlsformen. Beispiele zur Benutzung von Rückgabewerten in Schleifen finden sich im Anhang unter A.1.

Auch Shell-Skripts können einen Rückgabewert an aufrufende Prozesse zurückgeben. Wie das geht, steht in dem Abschnitt zu exit.