ubuntuusers.de

Bash: exit 1 beendet Script nicht

Status: Gelöst | Ubuntu-Version: Ubuntu 8.04 (Hardy Heron)
Antworten |

th3b0b

Avatar von th3b0b

Anmeldungsdatum:
9. März 2008

Beiträge: 25

Wohnort: Aachen

Hallo!

Ich möchte in einem Bashscript folgendes erreichen: Ein Befehl wird ausgeführt. Schlägt dieser fehlt (exit-Status != 0) soll eine kurze Fehlermeldung geschrieben und das Script beendet werden. Mein Ansatz/Versuch dazu:

<BEFEHL> || ( echo "Ein Fehler ist aufgetreten, Abbruch!"; exit 1 )

Das funktioniert aber leider nicht, das Script läuft einfach weiter... Was mach ich hier falsch?

Mfg: Der Bob

uname

Anmeldungsdatum:
28. März 2007

Beiträge: 6030

Wohnort: 127.0.0.1

Andere Klammern, nicht selbst probiert:

<BEFEHL> || { echo "Ein Fehler ist aufgetreten, Abbruch!"; exit 1 }

Ich kenne es aber eher so und weiss nicht, wann der <BEFEHL> als fehlerhaft gelten soll.

[ -f $NODE_ROOT/bin/nxserver ] || { echo "ERROR: $NODE_ROOT/bin/nxserver doesn't exist" ; exit 1; } 

Red_Radish

Anmeldungsdatum:
7. September 2007

Beiträge: 770

th3b0b schrieb:

Das funktioniert aber leider nicht, das Script läuft einfach weiter... Was mach ich hier falsch?

Die Klammern öffnen eine Subshell, diese wird wie gewünscht beendet - aber nicht der Hauptkontext 😉

<BEFEHL> || ( echo "Ein Fehler ist aufgetreten, Abbruch!"; exit 1 ; echo "das siehst du nicht mehr" )
echo "haha"

Wie wäre es einfach mit:

if ! <BEFEHL> ; then
   ...
   exit 1
fi

th3b0b

(Themenstarter)
Avatar von th3b0b

Anmeldungsdatum:
9. März 2008

Beiträge: 25

Wohnort: Aachen

Aaah, OK!!

Vielen Dank, mit "geschweiften" Klammern (heißen die so?) funktionierts perfekt! ☺

Wieder was dazu gelernt!!

unusedLogin

Anmeldungsdatum:
14. Juni 2016

Beiträge: Zähle...

Hallo Leute,

ich antworte mal drauf. Der Thread ist zwar scho älter, aber das Problem ist zeitlos.

Der Trick ist, dass sich das Befehle nacheinander per logisch 'und' (&&) verknüpfen lassen. Sobald man logisch 'oder' (||) verwendet, hört die Bearbeitung auf, sobald ein Ergebnis wahr ist.

An Stelle von A || B && C muss man verwenden: ! A && B && C.

Testscript program.sh

 #!/bin/bash
 return 1

Testscript validate.sh (ruft program.sh auf)

 #!/bin/bash
 ! ./program.sh && echo Error occured. Exiting. && exit 1
 echo No error. Program will continue.

Wenn jemand eine elegantere Lösung findet, immer her damit.

Grüße

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2503

unusedLogin schrieb:

Der Trick ist, dass sich das Befehle nacheinander per logisch 'und' (&&) verknüpfen lassen. Sobald man logisch 'oder' (||) verwendet, hört die Bearbeitung auf, sobald ein Ergebnis wahr ist.

Das spielt da zwar auch mit rein, aber das ursprüngliche Problem waren schon die runden Klammern und die damit verbundene Subshell, wie damals von Red_Radish aufgezeigt. ☺

Antworten |