it-swarm.com.de

Wie überprüfe ich, ob ein Befehl erfolgreich war?

Gibt es eine Möglichkeit zu überprüfen, ob bei der Ausführung eines Befehls ein Fehler vorliegt?

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 es bereits versucht, aber es scheint nicht zu funktionieren. Ich weiß nicht, wie das geht.

220
moata_u

Der Rückgabewert wird in _$?_ gespeichert. 0 zeigt Erfolg an, andere zeigen Fehler an.

_some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi
_

Wie bei jedem anderen Textwert können Sie ihn zum späteren Vergleich in einer Variablen speichern:

_some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi
_

Mögliche Vergleichsoperatoren finden Sie unter man test .

329
Lekensteyn

Wenn Sie nur wissen müssen, ob der Befehl erfolgreich war oder fehlgeschlagen ist, testen Sie $? nicht, sondern testen Sie 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 zu einer Variablen ändert den Rückgabewert nicht (naja, es sei denn, es verhält sich anders, wenn stdout natürlich 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.

86
geirha
command && echo OK || echo Failed
22
Abraham Sanchez

$? sollte den Exit-Status des vorherigen Befehls enthalten, der null sein sollte, damit kein Fehler auftritt.

So etwas wie;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

in den meisten Fällen ist es einfacher, Befehle, die voneinander abhängig sein müssen, mit dem Konstrukt && zu verketten. Also würde cd /nonexistant && echo success!nicht den Erfolg wiederholen, da der Befehl vor && abbricht. Die Konsequenz daraus ist ||, wobei cd /nonexistant || echo failwürde Echo fehlschlagen, weil CD fehlgeschlagen ist. (Dies ist nützlich, wenn Sie beispielsweise || exit verwenden, wodurch das Skript beendet wird, wenn der vorherige Befehl fehlgeschlagen ist.)

16
Shaun
command && echo $? || echo $?
5
modrobert

Es ist zu beachten, dass der Annäherungstyp if...then...fi und &&/|| den Beendigungsstatus behandelt, der von dem Befehl zurückgegeben wird, den wir testen möchten (0 bei Erfolg); Einige Befehle geben jedoch keinen Exit-Status ungleich Null zurück, wenn der Befehl fehlgeschlagen ist oder Eingaben nicht verarbeiten konnte. Dies bedeutet, dass die üblichen Ansätze if und &&/|| für diese bestimmten Befehle nicht funktionieren.

Unter Linux wird GNU file beispielsweise immer noch mit 0 beendet, wenn eine nicht vorhandene Datei als Argument empfangen wurde und find den angegebenen Benutzer nicht finden konnte.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

In solchen Fällen besteht ein möglicher Weg, wie wir mit der Situation umgehen können, darin, stderr/stdin Nachrichten zu lesen, z. Diejenigen, die vom Befehl file zurückgegeben wurden, oder die Ausgabe des Befehls wie in find analysieren. Zu diesem Zweck kann die Anweisung case verwendet werden.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(Dies ist eine Wiederholung meiner eigenen Antwort auf verwandte Frage bei unix.stackexchange.com )

3

Wie in vielen anderen Antworten erwähnt, reicht ein einfacher Test von $? aus

if [ $? -eq 0 ]; then something; fi

Wenn Sie testen möchten, ob der Befehl fehlgeschlagen lautet, können Sie eine kürzere Version in bash (aber möglicherweise einen Overkill) wie folgt verwenden:

if (($?)); then something; fi

Dies funktioniert im arithmetischen Modus (( )). Wenn der Befehl also success zurückgibt, dh $? = 0, wird der Test als ((0)) ausgewertet, der andernfalls als false testet es wird true zurückgeben.

Zum Testen auf Erfolg können Sie Folgendes verwenden:

if ! (($?)); then something; fi

aber es ist schon nicht viel kürzer als das erste Beispiel.

1
afuna

Für die Fehlerprüfung Ihrer Befehle:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

Inspiriert von Lean Manufacturing: