Mailinglist Archive: opensuse-de (1951 mails)

< Previous Next >
Re: Skript beenden
  • From: Steffen Dettmer <steffen@xxxxxxx>
  • Date: Sun, 11 Dec 2005 12:04:17 +0100
  • Message-id: <20051211110417.GJ17829@xxxxxxxxxxx>
* Andre Tann wrote on Sat, Dec 10, 2005 at 17:04 +0100:
> Ich möchte gern ein Skript beenden, falls eine Datei nicht
> existiert.
>
> Dieses funktioniert jedoch nicht:
>
> if test ! -f /datei ; then
> echo "Datei existiert nicht"
> exit 1
> fi
echo "Datei existiert"

Funktioniert bei mir so (GNU bash, version 2.05b.0(1)-release).

"if [ ! -f /datei ] ; then"

ist meines Wissens nach genau das gleiche.

> [weiteres Skript]
>
> In der if-Konstruktion führt das exit dazu, daß lediglich die
> if-Schleife verlassen wird.

Welche Schleife? Bei mir würde auch eine Schleife verlassen werden:

function x {
if test ! -f /gibts_nich ; then
echo "Datei existiert nicht"
exit 2
fi
}
rm -f /gibts_nich || exit 1
while true; do x; done

produziert:

steffen@link:~> ./x.sh ; echo $?
Datei existiert nicht
2
steffen@link:~>

Man kann natürlich das auch anders machen; verwendet man beispielsweise
eine Subshell, funktioniert "exit" natürlich anders! Wenn man c oder
perl gewohnt ist, wäre dies eine nette Falle (angenommen, function x
liest die Datei und verarbeitet die irgendwie, ist datei nicht da, ist
es ein Fataler Fehler und man möchte ganz abbrechen):

rm -f /gibts_nich || exit 1
while (x); do echo "Hallo"; done
echo "nach while";

"nach while" wird ausgegeben. Die Falle sind die Klammern "()", weil das
zu einer neuen Subshell führt. Diese wird mit exit verlassen, das while
bekommt ein FALSE (Hallo nicht nicht ausgeben), aber das Skript läuft
weiter.

Das ist in C und Perl natürlich ganz anders, daher eine Falle.

In bash kann man

while x; do echo "Hallo"; done

schreiben, oder, wenn man unbedingt Klammern möchte, auch gern:

while { x; } do echo "Hallo"; done

oder sowas in der Art nehmen. Ein Exit in "x" führt hier wieder zum
Scriptabbruch.

oki,

Steffen

--
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.

< Previous Next >
References