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.
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.
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
$?
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
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
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: