Shell-Skript, wenn die Bedingung nicht wie erwartet funktioniert

Shell-Skript, wenn die Bedingung nicht wie erwartet funktioniert

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“.

verwandte Informationen