Hallo Liste. 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 [weiteres Skript] In der if-Konstruktion führt das exit dazu, daß lediglich die if-Schleife verlassen wird. Aber das Skript beendet sich nicht. Wie macht man das richtig? Danke. -- Andre Tann
Am 10.12.2005 um 17:04 schrieb Andre Tann:
Hallo Liste.
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
if [ ! -f /datei ] ; then echo "Datei existiert nicht" exit 1 fi So funktioniert es bei mir. Gruß, Carsten.
Hallo, Am Sat, 10 Dec 2005, Andre Tann schrieb:
Ich möchte gern ein Skript beenden, falls eine Datei nicht existiert.
In der if-Konstruktion führt das exit dazu, daß lediglich die if-Schleife verlassen wird.
Nein. if ist keine Schleife. Und es funktioniert wie du's hast. Es sei denn du hast was mit 'test' angestellt. Oder bist in ner subshell. Alternativ: test -f /datei || { echo "`/datei' ist keine normale Datei oder existiert nicht" >&2; exit 2; } Der exitcode '2' ist der uebliche fuer ENOENT. Vgl. /usr/include/asm/errno.h und man 3 errno. -dnh -- BUGS It is not yet possible to change operating system by writ ing to /proc/sys/kernel/ostype. -- Linux sysctl(2) manpage
* 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.
participants (4)
-
Andre Tann
-
Carsten Boehlke
-
David Haller
-
Steffen Dettmer