* 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.