Gibt es eine Möglichkeit zu prüfen, ob bei der Ausführung eines Befehls ein Fehler aufgetreten ist?
Beispiel:
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
Ich habe bereits versucht, das zu tun, aber es scheint, dass es nicht funktioniert. Ich weiß nicht, wie das geht.
Der Rückgabewert wird in $?
gespeichert. 0 bedeutet Erfolg, andere bedeuten Fehler.
some_command
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
Wie jeder andere Textwert können Sie ihn in einer Variablen für einen späteren Vergleich speichern:
some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
echo "Return code was not zero but $retval"
fi
Für mögliche Vergleichsoperatoren siehe man test
.
Wenn Sie nur wissen müssen, ob der Befehl erfolgreich war oder fehlgeschlagen ist, brauchen Sie $?
nicht zu testen, testen Sie einfach den Befehl direkt. Z.B.:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
Und das Zuweisen der Ausgabe an eine Variable ändert den Rückgabewert nicht (es sei denn, es verhält sich anders, wenn stdout kein Terminal ist).
if output=$(some_command); then
printf 'some_command succeded, the output was «%s»\n' "$output"
fi
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals erklärt if
ausführlicher.
$? sollte den Exit-Status des vorherigen Befehls enthalten, der Null sein sollte, wenn kein Fehler vorliegt.
Also etwas wie;
cd /nonexistant
if [ $? -ne 0 ]
then
echo failed
else
echo success!
fi
In den meisten Fällen ist es einfacher, das && Konstrukt zu verwenden, um Befehle zu verketten, die voneinander abhängig sind. So würde cd /nonexistant && echo success!
nicht echo success sein, weil der Befehl vor && abbricht. Die logische Folge davon ist ||, wobei cd /nonexistant || echo fail
nicht erfolgreich wäre, weil cd fehlgeschlagen ist. (Dies wird nützlich, wenn Sie etwas wie ||exit verwenden, das das Skript beendet, wenn der vorherige Befehl fehlgeschlagen ist).