
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