Ich habe ein Shell-Skript mit verschachtelten Schleifen und habe gerade herausgefunden, dass "exit" das Skript nicht wirklich beendet, sondern nur die aktuelle Schleife. Gibt es eine andere Möglichkeit, das Skript unter bestimmten Fehlerbedingungen vollständig zu beenden?
Ich möchte "set -e" nicht verwenden, da es akzeptable Fehler gibt und es zu viel Umschreiben erfordern würde.
Im Moment verwende ich kill, um den Prozess manuell abzubrechen, aber es scheint, dass es einen besseren Weg geben sollte, dies zu tun.
bash -c 'for x in y z; do exit; done; echo "This never gets printed"'
.Antworten:
Ihr Problem sind an sich keine verschachtelten Schleifen. Es ist so, dass eine oder mehrere Ihrer inneren Schleifen in einer Unterschale ausgeführt werden .
Das funktioniert:
Ausgabe:
Dies stellt das von Ihnen beschriebene Problem dar:
Ausgabe:
Hier ist die Lösung; Sie müssen den Rückgabewert von inneren Schleifen testen, die in Unterschalen ausgeführt werden:
Beachten Sie den Test:
[[ $? != 0 ]] && exit $?
Ausgabe:
Bearbeiten: Um zu überprüfen, in welcher Subshell Sie sich befinden, ändern Sie das Antwortskript, um die Prozess-ID Ihrer aktuellen Shell anzugeben. HINWEIS: Dies funktioniert nur in Bash 4:
Ausgabe:
Die Variablen "i" und "j" wurden Ihnen mit freundlicher Genehmigung von Fortran zur Verfügung gestellt. Einen schönen Tag noch. :-)
quelle
bash --version
in die Befehlszeile ein, um Ihre Bash-Version anzuzeigen .Eine frühere Antwort schlägt vor , mit
[[ $? != 0 ]] && exit $?
jedoch wird dies nicht ganz wie erwartet, da der[[ $? != 0 ]]
Test zurückgesetzt wird$?
wieder auf Null, was bedeutet , dass , obwohl das Skript wird früh-Ausgang wie erwartet, es wird immer Ausfahrt mit dem Code 0 (wie nicht zu erwarten) . Außerdem ist es besser, den-ne
numerischen Vergleichstest als den!=
Zeichenfolgenvergleichstest zu verwenden. Daher ist meiner Meinung nach eine bessere Lösung:Dadurch wird sichergestellt, dass der tatsächliche Exit-Code korrekt eingestellt ist.
quelle
Sie können verwenden
break
.Von
help break
:Wenn Sie also drei umschließende Schleifen verlassen möchten, dh wenn Sie zwei verschachtelte Schleifen in einer Hauptschleife haben, verwenden Sie diese, um alle zu verlassen:
quelle
for((i=0;i<3;i++));do echo A;for((j=0;j<2;j++));do echo B;break 2;done;done
exit
beendet die gesamte Shell oder die aktuelle Sub-Shell:quelle