Zurück

Die for-Schleife in Shellscripts

Die for-Schleife hat in der Shell eine etwas andere Bedeutung als in den meisten Programmiersprachen. Wie kann man sie anwenden?

In den meisten Programmiersprachen kann man eine for-Schleife verwenden um eine while-Schleife, die nur aus einem simplen Zähler besteht, durch eine einfachere Schreibweise zu ersetzen. In der Shell muß jedoch auch weiterhin für diese Aufgabe eine while-Schleife verwendet werden.

Die for-Schleife dient in der Shell vielmehr zur Abarbeitung einer Liste. Die Liste kann dabei entweder explizit angegeben werden, oder aber sie wird durch einen weiteren Befehl erzeugt.

Dies wird z. B. dann interressant, wenn ich einen bestimmten Befehl nicht nur auf eine Datei anwenden möchte, sondern auf mehrere. In diesem Fall können mir zwar auch Wildcards helfen, jedoch gibt es Befehle bzw. Programme die damit Probleme haben.

Ein Beispiel: Ich habe ein ganzes Verzeichnis mit PDF-Dateien. Diese sollen alle in HTML-Dateien umgewandelt werden. Dafür gibt es das Programm pdftohtml. Dieses Programm versteht es jedoch nicht, wenn ich einfach eingebe:

pdftohtml *

Das Wildcardzeichen * funktioniert nicht. Daher kann ich hier eine for-Schleife verwenden. Die generelle Syntax einer for-Schleife sieht so aus:

for <var> in <liste>; do <befehle>; done

In unserem Fall können wir also schreiben:

for tmp in datei1 datei2 datei3; do pdftohtml $tmp; done


Damit haben wir aber das Problem nicht wirklich gelöst, da ich immer noch eine lange Liste als Argument an for übergeben muß. Wie jedoch bereits erwähnt kann ich anstatt die Liste explizit anzugeben, auch einen Befehl verwenden, der mir eine Liste erzeugt. Möchte ich also tatsächlich alle Dateien eines Verzeichnisses umwandeln kann ich ls verwenden. Die Shell muß jedoch erkennen können, das es sich um einen Befehl und nicht um eine beliebige Zeichenkette handelt. Dazu werden sogenannte Backticks verwendet. Ein Befehl der innerhalb eines anderen Befehls in einem Backtick verwendet wird, wird erst ausgeführt und sein Ergebnis an die Stelle des Befehls gesetzt. Das Backtickzeichen ist das Akzentzeichen `. Der entsprechende Befehl für unser Beispiel kann also lauten:

for tmp in `ls`; do pdftohtml $tmp; done

Beachten Sie bitte auch, daß nach dem for-Befehl, sowie nach dem in der Schleife ausgeführten Befehl ein ; kommt, jedoch nach dem do-Befehl nicht. Innerhalb eines Shellscripts kann man statt des ";" , natürlich auch einen Zeilenumbruch verwenden:

#!/bin/bash

for tmp in `ls`
do
pdftohtml $tmp
done

exit 0

Zurück

Zurück nach oben
Shell mit Kommandoprompt