
Ich habe ein Skript geschrieben, um einige Linux-Befehle auszuführen, die Ausnahmen in einer if-Klausel zu erfassen und die Ergebnisse auszugeben. Grundsätzlich stellt jede der Variablen im folgenden Codeauszug den Status der Befehlsausführung dar, und ich möchte das Skript erfolgreich beenden, wenn alle Befehle erfolgreich ausgeführt wurden. Andernfalls möchte ich mit einem beenden. Beim Testen des Skripts habe ich absichtlich einen Befehl fehlschlagen lassen, und die Ausgabe einer Variable, z. B. X8, ist 1. In diesem Szenario funktioniert das Folgende nicht wie erwartet. Es zeigt mir die Erfolgsmeldung anstelle der Meldung „Skript fehlgeschlagen“. Ich bin mir nicht sicher, warum
if [ $X1 != 0 ] && [ $X2 != 0 ] && [ $X3 != 0 ] && [ $X4 != 0 ] && [ $X5 != 0 ] && [ $X6 != 0 ] && [ $X7 != 0 ] && [ $X8 != 0 ];
then echo "script failed"; exit 1;
else echo "success"; fi;
Antwort1
Fügen Sie oben in Ihrem Skript Folgendes hinzu:
trap 'echo "Error $? at $LINENO; aborting." 1>&2; exit $?' ERR
Wenn dann ein nicht abgefangener Fehler auftritt, wird das Skript mit der obigen Meldung abgebrochen und mit dem Exitcode des Fehlers beendet. Sie können $?
dies ändern 1
, wenn Sie für jeden Fehler wirklich den Exitcode 1 verwenden möchten.
Antwort2
Zunächst einmal verwenden Sie , [
was die Kurzform für ist test
. Von man test
:
STRING1 != STRING2 the strings are not equal
Sie verwenden das falsche Werkzeug für die Arbeit. Was Sie brauchen, ist
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2
Zweitens müssen Sie hier mehrere Bedingungen testen. Anstatt eine lange if-Anweisung zu verwenden, versuchen Sie, die Ausgabe jeder Variable zu summieren, wie Glenn in den Kommentaren vorgeschlagen hat, und testen Sie das. Alternativ können Sie die Ausgabe jedes Befehls direkt nach seiner Ausführung auswerten. Es macht keinen Sinn, andere auszuführen, wenn Sie das Programm sowieso beenden, weil die Ausgabe dieses Befehls erfolgt.
Hier ist ein Looping-Ansatz:
for i in $X1 $X2 $X3 ;
do
[ $i -ne 0 ] && { echo "something failed"; exit 1; }
done
echo "Everything OK"
Der Trick dabei ist, dass Sie für jede einzelne Variable den gleichen Test durchführen. Wenn dieser Test fehlschlägt, gelangt das Skript nie zum Teil „Alles OK“.