| Home Profil Fun |
#63 Linux 07.06.2009
For-Schleifen als Einzeiler und in Shell-SkriptenDie 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. |