exit-Anweisung wird nicht brechen while-Schleife in der unix-shell
Die exit-Anweisung in jedem status überprüfen if-Anweisung keine break die while-Schleife und wirklich beenden Sie das Skript. Gibt es etwas, was ich tun kann, die Schleife zu brechen und beenden Sie mit $STATUS code?
EDIT: ich habe aktualisiert mein code und es immer noch nicht funktioniert. Den status überprüfen if-Anweisungen erfolgreich brechen die Schleife, aber wenn ich versuche zu bewerten, die $EXIT_STATUS es ist immer null, wahrscheinlich etwas zu tun mit Umfang. Was vermisse ich hier?
if [ $RESTART -le $STEP ]; then
. tell_step
while read XML_INPUT; do
XML_GDG=`get_full_name $GDG_NAME P`
cp $XML_INPUT $XML_GDG
STATUS=$?
EXIT_STATUS=$STATUS
if [ $STATUS -ne 0 ]; then
break
fi
add_one_gen $XML_GDG
STATUS=$?
EXIT_STATUS=$STATUS
if [ $STATUS -ne 0 ]; then
break
fi
done < $XML_STAGE_LIST
echo $EXIT_STATUS
if [ $EXIT_STATUS -ne 0 ]; then
exit $EXIT_STATUS
fi
fi
- schnelle Kommentar - schwer zu Lesen ein Skript mit soo vielen UPPERCASES. Versuchen Sie behalten die Großbuchstaben für einige "spezielle" Variablen (oder besser, nur für den Export sind)..
- Verwenden
break
stattexit
. - break beendet die Schleife, aber nicht beenden Sie das Skript mit dem status, ich bin im wesentlichen versucht, beides zu tun.
- Und was ist mit der Speicherung der exit-status in eine variable (
exit_status=$STATUS
) in diesen Fällen und dann beenden mitexit $exit_status
? - Guten aufrufen, das sollte funktionieren.
- Ich habe versucht, deine vorgeschlagene Methode, aber ich kann nicht scheinen, um es zu arbeiten. Ich Speichere die $STATUS $exit_status aber einmal bin ich außerhalb der Schleife und überprüfen Sie die $exit_status Wert ist immer null, auch, nachdem es festgelegt wurde, innerhalb der Schleife.
- Uhms, das ist komisch. Machen Sie auch einen guten Ausgang in
echo $EXIT_STATUS
? - NÖ.
- Warum halten Sie zurücksetzen
STATUS
? Warum nichtif [ $? -ne 0]
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht wirklich verstehen, warum dein script somit nicht beendet auf den Ausgang, denn die nächste ist funktioniert ohne Probleme:
es läuft, produziert:
wie Sie sehen können, wird das Skript beendet daraufhin sofort und nicht überprüft, so dass der "daemon".
Na ja, vielleicht ist es besser lesbar, wenn Sie verwenden
bash functions
wie:beim laufen wie:
so, Schritt 1 war OK und verlassen auf der step2 (nonexisten-Datei) - grep exit-status 2, und wenn
beendet daraufhin sofort auf Schritt 1 (bullshit nicht in /etc/passwd) - grep exit-status 1
Ich hatte das gleiche problem: wenn die Paspel in einer while-Schleife, das Skript nicht beenden auf beenden. Sondern es wirkte wie "Pause" machen sollten.
Ich gefunden habe, gibt es 2 Lösungen:
a) Nach deiner while-Schleife prüfen Sie die return-code der while-Schleife, und exit dann:
b) Setzen Sie das bash-Skript zum beenden auf eventuelle Fehler. Fügen Sie diese an den Anfang Ihres Skripts:
Müssen Sie
break
aus der Schleife und dannexit
aus dem Skript. Sie können eine variable, die gesetzt ist auf Fehler zu prüfen, wenn Sie brauchen, umexit
mit einem Fehler.Ich hatte ein ähnliches problem beim pipelining. Meine Vermutung ist eine separate shell gestartet wird, wenn piplining. Hoffentlich hilft es jemand anders, der stolpert über das problem.
Vom jm666 ' s post oben, diese wird nicht gedruckt 'Hier bin ich!':
Jedoch die folgenden, die Rohre die Namen der while-Schleife tut. Es wird auch beenden Sie mit einem code 0. Die Festsetzung der Variablen und
break
ing scheint nicht zu funktionieren (was Sinn macht, wenn es eine andere shell). Eine andere Methode muss verwendet werden, um entweder kommunizieren die Fehler oder die situation vermeiden, in den ersten Platz.