4.12 Die until-Schleife
Die until-Schleife wird im Gegensatz zur while-Schleife so lange ausgeführt, bis das Kommando in der until-Schleife einen Wert ungleich 0, also falsch (!) zurückgibt. Die Abbruchbedingung der Schleife ist gegeben, wenn das Kommando erfolglos war. Die Syntax:
until [bedingung] falsch # oder auch: until-kommando falsch
do
kommando1
...
kommandon
done
So lange also die Bedingung oder die Kommandoausführung falsch (false oder ungleich 0) hinter until zurückgibt, werden die Kommandos zwischen do und done ausgeführt. Ist der Rückgabewert hingegen wahr (true oder 0), dann wird mit der Ausführung hinter done fortgefahren (siehe Abbildung 4.13).
Manch einer wird jetzt nach dem Sinn der until-Schleife fragen, denn alles, was man mit der until-Schleife machen kann, kann man ja auch mithilfe des Negationsoperators ! oder durch Umstellen der Bedingung in einer while-Schleife erreichen, zum Beispiel im Script awhile2:
while [ "$input" != "ende" ]
do
...
done
Schreibt man hierfür
while [ ! "$input" = "ende" ]
do
...
done
hätte man dasselbe erreicht wie mit der folgenden until-Schleife:
until [ "$input" = "ende" ]
do
...
done
Ebenso sieht dies beim Durchzählen von Zahlenbereichen aus. Dass es die until-Schleife dennoch gibt und dass diese auch nötig ist, liegt daran, dass die echte Bourne-Shell kein ! kennt. Wenn Sie in der Bourne-Shell Ausdrücke wie [ ! "$input" = "ende" ] ausführen, werden diese zwar funktionieren, aber dies liegt nur daran, dass Sie hier das test-Kommando verwenden. Und test wiederum kann etwas mit ! anfangen. Überprüfen Sie allerdings den Rückgabewert eines Befehls mit !, wird sich die echte Bourne-Shell schon bei Ihnen melden.
Hierzu ein einfaches Beispiel: In Ihrem Script benötigen Sie ein Kommando namens »abc«, welches aber nicht standardmäßig auf jedem Rechner installiert ist. Statt jetzt nur eine Fehlermeldung auszugeben, dass auf dem System das Tool »abc« fehlt, um Ihr Script auszuführen, bieten Sie dem Anwender doch gleich eine Installationsroutine mit an, beispielsweise indem Sie entsprechendes Tool im Quellcode mitliefern und mit entsprechenden Optionen übersetzen lassen und installieren. Natürlich können Sie das Paket auch mit einem passenden Paketmanager (bspw. rpm oder apt) vom Netz holen lassen und installieren. Sie müssen aber hier nicht zwangsläufig eine neue Anwendung installieren – häufig will man auch nur ein neues Script in entsprechende Pfade legen. Hierbei sind Ihnen kaum Grenzen gesetzt. Im Script wird einfach das Kommando cat mit cp in ein Verzeichnis kopiert. Im Beispiel wurde das Verzeichnis $HOME/bin verwendet, das bei mir auch in PATH eingetragen ist. Dies ist Voraussetzung, wenn Sie das Kommando anschließend ohne ./ vor dem Kommandonamen aufrufen wollen.
# Demonstriert die Verwendung einer until-Schleife
# auntil
# Hier soll ein Kommando namens "abc" installiert werden
until abc /dev/null > /dev/null 2>&1
do
echo "Kommando abc scheint hier nicht zu existieren"
# Jetzt können Sie "abc" selbst nachinstallieren ...
# Wir verwenden hierbei einfach ein Hauswerkzeug mit cat
new=`which cat` # kompletten Pfad zu cat
cp $new $HOME/bin/abc
done
# ... den eigenen Quellcode ausgeben
abc $0
Das Script bei der Ausführung:
you@host > ./auntil
# Demonstriert die Verwendung einer until-Schleife
# auntil
# Hier soll ein Kommando namens "abc" installiert werden
until abc /dev/null > /dev/null 2>&1
...
you@host > abc > test.txt
Hallo ein Test
you@host > abc test.txt
Hallo ein Test
Dieses Beispiel können Sie auf jeden Fall nicht in einer echten Bourne-Shell mit einer while-Schleife nachbilden. Die Betonung liegt hier auf »echt«, weil es diese unter Linux nicht gibt. Unter Linux führt jede Verwendung der Bourne-Shell zur Bash und somit kann hierbei auch der Negationsoperator ! verwendet werden.
Weitere typische Beispiele wie das Script »auntil« sind auch selbstentpackende Installer, die beim Aufruf den komprimierten Quellcode auspacken und installieren.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|