Copyright © 1995 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux - Wegweiser zur Installation & Konfiguration", dann klicken Sie hier.


Kapitel 6

Die Shell-Programmierung

Im Abschnitt » Shells « in Kapitel 3 haben wir diverse Shells besprochen, die es für Linux gibt; hier wollen wir auf die Shell-Programmierung eingehen. Beim Schreiben von Shell-Skripts zeigen sich die Unterschiede am deutlichsten. Die Sprachen für die Bourne-Shell und die C-Shell weisen gewisse Unterschiede auf, aber bei der normalen interaktiven Benutzung fallen diese nicht so sehr ins Auge. Viele Unterschiede machen sich sogar erst dann bemerkbar, wenn Sie versuchen, solche wenig bekannten Eigenschaften der Shells wie das Ersetzen von Wörtern oder einige der versteckten Funktionen zur Expandierung von Parametern zu benutzen.

Die deutlichsten Unterschiede zwischen Bourne- und C-Shells zeigen sich bei den Strukturen der Ablaufkontrolle einschließlich der if... then- und while-Schleifen. In der Bourne-Shell hat ein if... then das Format:

if  liste 
then
   befehle 
elif liste 
then 
   befehle 
else
   befehle 
fi

wobei die Liste eine Reihe von Befehlen darstellt (ganz allgemein »Pipeline« genannt), die als Bedingung für die Befehle if und elif (Kurzform von »else if«) benutzt wird. Die Bedingung gilt als erfüllt, wenn der Exit-Status der Liste gleich null ist (anders als bei Booleschen Ausdrücken in C zeigt in der Shell-Programmierung der Exit-Status null die erfolgreiche Beendigung an). Die Befehle innerhalb der Bedingungen sind einfach die Anweisungen, die ausgeführt werden sollen, wenn die entsprechende Liste wahr ist. Das then hinter jeder Liste muß auf einer neuen Zeile stehen, um es von der Liste selbst abzusetzen; alternativ dazu können Sie die Liste auch mit einem ; abschließen; dies gilt auch für die Befehle .

Ein Beispiel:

if [ "$PS1" ]; then
  PS1="\h:\w% "
fi

Diese Folge von Anweisungen prüft, ob es sich bei der Shell um eine Login-Shell handelt (also ob die Prompt-Variable PS1 gesetzt ist). Wenn ja, wird der Prompt auf "\h:\w% " gesetzt, was beim Expandieren zum Rechnernamen mit aktuellem Arbeitsverzeichnis wird -- etwa so:

loomer:/home/loomer/mdw%

Die Bedingung »[...]« hinter dem if ist ein interner bash-Befehl und eine abgekürzte Schreibweise für test . Der Befehl test und seine Kurzform stellen einen einfachen Mechanismus zum Testen der Werte von Shell-Variablen, zum Vergleich von Zeichenfolgen usw. dar. Statt [...] könnte hinter dem if eine beliebige andere Kombination aus Befehlen stehen; es muß nur sichergestellt sein, daß der Exit-Status des letzten Befehls den Wert der Bedingung widerspiegelt.

Unter der tcsh sieht eine if... then-Kombination so aus:

if (ausdruck) then
   befehle 
else if (ausdruck) then
   befehle 
else
   befehle 
endif

Der Unterschied liegt darin, daß der Ausdruck hinter dem if ein arithmetischer oder logischer Ausdruck ist, der von der tcsh intern ausgewertet wird. In der bash dagegen bildet ein Befehl die Bedingung, deren Wahrheitsgehalt vom Exit-Status des Befehls bestimmt wird. Die Verwendung von test oder [...] unter bash ähnelt der Verwendung von arithmetischen Ausdrücken unter tcsh .

Wenn Sie allerdings unter der tcsh innerhalb von Ausdruck einen externen Befehl aufrufen möchten, müssen Sie diesen in Klammern einschließen: { befehl }.

Das Gegenstück zu der oben gezeigten bash -Befehlsfolge sieht unter tcsh so aus:

if ($?prompt) then
  set prompt="%m:%/%% "
endif

wobei wir die speziellen Prompt-Codes von tcsh benutzt haben. Sie werden bemerken, daß tcsh eine Syntax benutzt, die der von C ähnelt, und daß es sich bei den Ausdrücken um arithmetische und logische Terme handelt. Unter der bash dagegen besteht fast alles aus richtigen Befehlen, und Ausdrücke werden anhand des Exit-Status ausgewertet. Die beiden Shells haben vergleichbare Fähigkeiten, verfolgen aber verschiedene Herangehensweisen.

Ähnlich sieht es bei der while-Schleife aus. In der bash hat sie folgendes Format:

while liste 
do
   befehle 
done

Sie erzielen den gegenteiligen Effekt, wenn Sie while durch until ersetzen. Die Liste ist wieder eine Befehls-Pipeline, deren Exit-Status den Wert der Bedingung bestimmt (null zeigt die erfolgreiche Ausführung an, ein anderer Wert die erfolglose). Unter tcsh sieht diese Schleife so aus:

while (ausdruck)
   befehle 
end

wobei der Ausdruck ein logischer Term ist, der innerhalb der tcsh ausgewertet wird.

Dies sollte ausreichen, um die wesentlichen Unterschiede in Shell-Skripts unter bash und tcsh zu verstehen. Lesen Sie auf jeden Fall die Manual-Pages zu bash und tcsh (obwohl diese kaum als Lehrbuch geeignet sind; es sind eher Nachschlagewerke), und schauen Sie sich gegebenenfalls auch die Info-Seiten an. Es liegen auch einige Bücher und Lehrbücher zur Benutzung dieser beiden Shells vor -- eigentlich können Sie jedes Buch zum Thema Shell-Programmierung benutzen und sich die Vorteile von bash und tcsh gegenüber den Standard-Shells aus den Man-Pages erschließen.


Inhaltsverzeichnis Vorherige Abschnitt Nächste Abschnitt