Dieser Vortrag zeigt anhand ausgewählter Beispiele, wie umfangreich die Möglichkeiten von Shellprogrammen unter Linux sind. Im Besonderen werden in diesem ersten Teil reguläre Ausdrücke ausführlich behandelt und es wird ein Überblick über die vielen kleinen Tools gegeben, die soviel Arbeit abnehmen können.
Die folgende Übersicht gibt alle wichtigen Metazeichen an, die in regulären Ausdrücken benutzt werden können.
Die Wirkungsweise der einzelnen Metazeichen soll mit den folgenden einfachen Beispielen etwas verdeutlichet werden.
Die Bash ermöglicht arithmetische Berechnungen. Der Ausdruck in $[...] wird entsprechend den üblichen Regeln ausgewertet. Neben den ganzzahligen Grundrechenoperationen werden eine ganze Reihe von Bitoperationen und logischen Operationen unterstützt.
echo $[5*3] # Multiplikation echo $[8%3] # 8 modulo 3 echo $[3<<2] # bitweises Verschieben echo $[7#14] # die Zahl 14 im 7-er System
Das folgende Shellskript erwartet eine Zahl als Parameter. Es wird von 1 bis zu dieser Zahl gezählt, wobei jede Sekunde eine Zahl ausgegeben wird.
#!/bin/sh if test $# -eq 0 then echo 'Syntax: zaehle <nr>' exit 1 fi i=1 while test $i -le $1 do echo $i i=$[$i+1] sleep 1 done
Die Ausgaben von Programmen können auf einfache Weise in einem Shellskript benutzt werden. Das zwischen `...` eingeschlossene Kommando wird an dieser Stelle ausgeführt, und die Ausgaben des Kommandos können im Skript benutzt werden.
Das folgende Beispiel liest in einer Reihe von Postscriptdateien, wieviele Seiten sie enthalten, und zählt alle Seiten zusammen.
#!/bin/sh n=0 for f in *.ps do echo -n "File \`$f': " i=`grep %%Pages: $f | sed -e 's/%%Pages: *//'` echo $i Seiten n=$[$n+$i] done echo "Seitenanzahl: $n"
Die Bash bietet vielfältige Möglichkeiten die Ausgabe von Programmen umzulenken. Zwei besonders interessante Möglichkeiten sollen vorgestellt werden.
1. Zusammenführen von stdout und stderr
Viele Programme schreiben ihre Ausgaben auf stdout und stderr. Sollen beide Ströme in ein File gelenkt werden, ist wie folgt vorzugehen:
programm > file_out 2>&1
Der Ausdruck bedeutet, dass die Ausgaben von stderr auf stdout umgeleitet werden, die wiederum in das File file_out ausgegeben werden.
2. Ausgabe auf stderr
Manchmal besteht der Wunsch, aus einem Skript heraus Ausgaben nach stderr zu schreiben, um so eventuell die Ausgaben des Shellskriptes zu trennen. Mit echo und der Fileumlenkung ist das wie folgt möglich:
echo "Hello World" 1>&2
Die Ausgaben erscheinen auf stderr.
Mit dem echo-Kommando und der Dateiumlenkung ist es möglich, aus einem Shellskript heraus eine neue Datei anzulegen:
echo "Hello World!" > new_datei
Sollen in die Datei fortlaufend mehrere Zeilen geschrieben werden, kann anstatt mehrerer echo-Zeilen folgende Lösung benutzt werden:
cat > new_datei <<EOF Hallo Welt! Das ist ein mehrzeiliger Text, der in der neuen Datei erscheinen soll. EOF
Folgendes Problem: Im Shellskript soll ein Textfile feldweise gelesen werden, wobei die Felder durch Tabulatoren getrennt sinden. Normalerweise liefern folgende Zeilen
for i in `cat textfile` do echo $i done
die Datei wortweise.
Für die Trennung einer Zeile in einzelne Wörter benutzt die Bash die interne Variabel IFS, die alle möglichen Trennzeichen enthält. Standardmäßig ist hier IFS=<space><tab><newline> eingestellt.
Das oben gestellte Problem wird nun durch folgende Zeilen gelöst:
IFS="<tab>" for i in `cat textfile` do echo $i done
Ein etwas umfangreicheres Beispiel für die Shellprogrammierung ist die Talking Clock. Das Skirpt beherrscht im Wesentlichen drei verschieden Arten von Uhren: eine sprechende Uhr, eine Kirchenuhr und eine Kuckucksuhr. Bei den ersten beiden wird die Zeit jede Viertelstunde angezeigt, indem unter Verwendung fertiger Sounddateien die Zeit angesagt wird bzw. entsprechend häufig die Uhr geschlagen wird. Die Kuckucksuhr zeigt zu jeder vollen Stunde die Zahl der Stunden an.
Der Aufruf der Uhr erfolgt am einfachsten via crontab. Für die Nutzung der Uhr werden außerdem die folgenden Soundfiles benötigt.
Die folgende Übersicht stellt eine Reihe mehr oder weniger leistungsfähiger Programme vor, die beim Schreiben von Shellskripten von vielfältigem Nutzen sein können.