Home   Profil   Fun
#63 Linux  07.06.2009

For-Schleifen als Einzeiler und in Shell-Skripten


Die Syntax ist unterschiedlich für Bash und csh. Die folgenden Beispiele sind für die Bash geschrieben.

Die Login-Shell herausfinden.
echo $SHELL

Wenn man während einer Session bash oder csh eingibt und somit eine ander Shell startet wird diese Umgebungsvariable nicht aktualisiert. Sie repräsentiert also nur die Login-Shell. Die Login-Shell kann in /etc/passwd geändert werden.

For-Schleifen kann man als Einzeiler von der Kommandozeile aus verwenden oder innerhalb von Shell-Skripten. Wir starten mit Beispielen für die Kommandozeile.

Alle Zeilen von test.txt ausgeben.
for i in `cat test.txt`; do echo $i; done

Die Namen aller Dateien in /tmp, die mit .txt enden, ausgeben, inklusive Unterverzeichnisse.
for i in `find /tmp -name "*.txt"`; do echo $i; done

Einfach eine Liste von Buchstaben ausgeben.
for i in a b c; do echo $i; done

Eine andere Methode funktioniert über das Erstellen einer Parameterliste.
export VARTEST="a b c"
for i in $VARTEST; do echo $i ; done

Auch verschachtelte Schleifen können von der Shell aus ausgeführt werden. Dieses Beispiel findet alle Dateien im aktuellen Arbeitsverzeichnis, die mit .txt enden. Dann gibt es den Inhalt dieser Dateien aus.
for i in *.txt; do for ii in `cat $i`; do echo $ii; done; done

Der nächste Einzeiler macht ein bisschen mehr innerhalb der Schleife. Ich habe dies geschrieben, als ich einmal den ersten mx-Eintrag einer langen Listen von Domains benötigte. Zuerst wird der Inhalt von domains.txt ausgelesen. Hierbei handelt es sich lediglich um eine Liste von Domainnamen. Dann wird das Kommando dig verwendet, um den ersten mx-Eintrag zu ermitteln. Die Kommandos head und awk bereinigen die Ausgabe und entfernen unnötige Zeilen und Spalten.
for i in `cat domains.txt`; do dig $i mx +short | head -n1 | awk '{print $2}'; done

Innerhalb eines Shell-Skriptes ist die Syntax natürlich viel übersichtlicher.
for i in `cat test.txt`
do
  echo $i
done

Standardmäßig wird die Parameterliste von For-Schleifen anhand von Leerzeichen, Tabs oder newlines aufgesplittet. Man kann dies jedoch ganz nach Bedarf ändern, indem man den IFS (internal field separator) entsprechend setzt.