web-dev-qa-db-fra.com

Comment vérifier le statut de sortie à l'aide d'une instruction if

Je me demandais quel serait le meilleur moyen de vérifier le statut de sortie dans une instruction if afin de faire écho à une sortie spécifique.

Je pense à cela

if [ $? -eq 1 ]
then
   echo "blah blah blah"
fi

Le problème que je rencontre également est que l'instruction de sortie est antérieure à l'instruction if simplement parce qu'elle doit avoir ce code de sortie. De plus, je sais que je fais quelque chose de mal, car la sortie quitterait évidemment le programme.

182
deadcell4

Chaque la commande qui s'exécute a un statut de sortie.

Cette vérification examine l'état de sortie de la commande qui s'est terminée le plus récemment avant que cette ligne soit exécutée.

Si vous voulez que votre script se ferme lorsque le test renvoie vrai (la commande précédente a échoué), vous placez exit 1 (ou autre) à l'intérieur de ce bloc if après le echo.

Cela étant dit, si vous exécutez la commande et que vous souhaitez tester sa sortie à l'aide de ce qui suit, la procédure est souvent plus simple.

if some_command; then
    echo command returned true
else
    echo command returned some error
fi

Ou pour renverser la situation, utilisez ! pour la négation

if ! some_command; then
    echo command returned some error
else
    echo command returned true
fi

Notez cependant qu'aucun de ces soucis quoi le code d'erreur est. Si vous savez que vous ne vous souciez que d'un code d'erreur spécifique, vous devez vérifier $? manuellement.

194
Etan Reisner

Notez que les codes de sortie! = 0 sont utilisés pour signaler une erreur. Donc, il vaut mieux faire:

retVal=$?
if [ $retVal -ne 0 ]; then
    echo "Error"
fi
exit $retVal

au lieu de

# will fail for error codes > 1
retVal=$?
if [ $retVal -eq 1 ]; then
    echo "Error"
fi
exit $retVal
133
Oo.oO

$? est un paramètre comme un autre. Vous pouvez enregistrer sa valeur à utiliser avant d'appeler finalement exit.

exit_status=$?
if [ $exit_status -eq 1 ]; then
    echo "blah blah blah"
fi
exit $exit_status
33
chepner

Alternative à l'instruction if explicite

Au minimum:

test $? -ne 0 || echo "something bad happened"

Achevée:

EXITCODE=$?
test $EXITCODE -ne 0 && echo "something good happened" || echo "something bad happened"; 
exit $EXITCODE
2
Catskul

Juste pour ajouter au utile et détaillé réponse :

Si vous devez vérifier le code de sortie de manière explicite, il est préférable d'utiliser l'opérateur arithmétique, (( ... )), de cette façon:

run_some_command
(($? != 0)) && { printf '%s\n' "Command exited with non-zero"; exit 1; }

Ou utilisez une instruction case:

run_some_command; ec=$?  # grab the exit code into a variable so that it can
                         # be reused later, without the fear of being overwritten
case $ec in
    0) ;;
    1) printf '%s\n' "Command exited with non-zero"; exit 1;;
    *) do_something_else;;
esac

Réponse associée sur la gestion des erreurs dans Bash:

1
codeforester