Vor- und Nachteile verschiedener Shells

Ratgeber: Shells für Linux und Unix richtig nutzen

Schleifen programmieren

Schleifen kann man in Shell-Skripten ebenfalls programmieren. Dazu dient der for-do-Befehl:

#!/bin/sh

FILELIST="datei1.ext datei2.ext datei3.ext"

for FILENAME in $FILELIST

do

if test -f $FILENAME; then

cp $FILENAME ~/test1/

cp $FILENAME ~/test2/

else

echo "Datei $FILENAME nicht vorhanden"

fi

done

Hier stehen ein paar Dateinamen in der Variablen FILELIST. Der Befehl for erkennt die Liste anhand der enthaltenen Leerzeichen und geht sie der Reihe nach durch. Jeder Listeneintrag wird der Variablen FILENAME zugewiesen. Danach wird die Datei kopiert, die gerade an der Reihe ist. Beachten Sie, dass nach einem for ein do stehen muss und dass ans Ende der Schleife ein done gehört.

Kommandozeilenparameter im Skript

Noch ist das Skript nicht sehr eigenständig. Besser wäre es, wenn Sie die obige Liste als Kommandozeilenparameter übergeben könnten, also in der Form:

./Shellskript datei1.ext datei2.ext

und so weiter. Das geht so:

#!/bin/sh

if [ $# -lt 1 ]; then

echo "Fehler: Kein Dateiname eingegeben"

echo "Benutzung: $0 datei.ext [datei2.ext] [datei.ext]"

fi

while [ $# -gt 0 ]

do

FILENAME=$1

if test -f $FILENAME; then

echo "Kopiere $FILENAME"

cp $FILENAME ~/test1/

cp $FILENAME ~/test2/

else

echo "Datei $FILENAME nicht vorhanden"

fi

shift

done

Damit versteht das Programm auch Kommandozeilenparameter. Zunächst allerdings prüft es, ob die Parameter vorhanden sind. Das geht am besten mit der Spezialvariablen $#. Die enthält die Anzahl der übergebenen Parameter. Mit if [ $# -lt 1 ]; then prüft das Skript, ob weniger als ein Parameter vorhanden sind. Ist das der Fall, gibt das Skript eine Fehlermeldung und eine kurze Anleitung über die Benutzung aus. Dabei kommt $0 zum Einsatz. Diese Variable enthält den Programmnamen selbst.

Sind genügend Parameter vorhanden, tritt eine While-Schleife in Kraft. Sie zählt bei jedem Durchlauf die Anzahl der vorhandenen Parameter mit while [ $# -gt 0 ]. Das -gt steht für "greater than". Solange diese Bedingung zutrifft, wird in der folgenden Schleife immer der Parameter $1 der Variablen FILENAME zugewiesen. Kurz vor dem Ende der Schleife kommt noch der Befehl shift ins Spiel. Der sorgt dafür, dass der erste Eintrag aus der Parameterliste gelöscht wird und dafür der nächste an seine Stelle trifft. So rücken also alle Parameter auf die Stelle von $1 und können abgearbeitet werden.

Fallen für Bash-Programmierer

Bash-Programmierung ist nur etwas für starke Gemüter - zumindest so lange, bis man sich an die Eigenheiten der Skript-Sprache gewöhnt hat. Bis dahin lauern jede Menge Fallen auf den Programmierer, unter anderem mit so banalen Dingen wie den Variablen.

Variablen-Falle I: Bei der Zuweisung hat eine Variable kein vorangestelltes Dollarzeichen, also

WERT="Hallo"

Wird die Variable jedoch an anderer Stelle im Programm verwendet, so muss das Dollarzeichen vorangestellt werden, also

echo $WERT

Variablen-Falle II: Bei der Zuweisung einer Variablen darf vor und nach dem Gleichheitszeichen keinesfalls ein Leerzeichen stehen. Wer aus alter Programmierergewohnheit

WERT = "Hallo"

schreibt, hat schon verloren und produziert einen Fehler. Denn es muss so aussehen:

WERT="Hallo"

Fehlerfreie Bash-Programmierung bedarf größter Sorgfalt, allerdings bietet sie dafür viele Möglichkeiten. (hal)