Je me demandais quelle serait la meilleure façon de vérifier l'état de sortie dans une instruction if afin de faire écho à une sortie spécifique.
Je pense que c'est
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
Le problème que j'ai également, c'est que l'instruction exit se trouve avant 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.
bash
shell
if-statement
error-handling
deadcell4
la source
la source
some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}
Réponses:
Chaque 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 l'exécution de cette ligne.
Si vous voulez que votre script se termine lorsque ce test retourne vrai (la commande précédente a échoué), vous mettez
exit 1
(ou quoi que ce soit) à l'intérieur de ceif
bloc après leecho
.Cela étant dit, si vous exécutez la commande et que vous souhaitez tester sa sortie à l'aide de ce qui suit est souvent plus simple.
Ou pour changer cela, utilisez
!
pour la négationNotez cependant qu'aucun de ces soins que 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.la source
a_command || return 1
return
ne fonctionne que dans une fonction et un script d'origine. Vous avez besoinexit
de l'autre cas (qui en fait trop dans une fonction et un script source). Mais oui, c'est certainement un modèle raisonnable si vous n'avez pas besoin de nettoyage spécifique ou de sortie supplémentaire.dash
, le shell non interactif par défaut dans de nombreuses distributions Linux modernes, ne se soucie pas de la distinction entrereturn
et à l'exit
intérieur des scripts shell exécutés.dash
quitte le script même si je l'utilisereturn
.if <command>
passe si le code de sortie est 0. Dans toute autre langue, ce serait l'inverseif ! some_command | some_other_command
ignorera le statut de some_command. Les deux solutions de contournement les plus courantes consistent àset -o pipefail
(peut modifier les fonctionnalités dans d'autres parties de votre programme) ou à déplacer l'if
instruction enif [[ ${PIPESTATUS[0]} -ne 0 ]]
tant que commande de suivi distincte (laide mais fonctionnelle). Si vous utilisez,set -e
vous souhaiterez également ajouter|| true
à la fin du tuyau lors de l'utilisation de la deuxième solution, car la suppression du tuyau du flux de contrôle proposé parif
entraînerait sinon sa fermeture immédiate.Notez que les codes de sortie! = 0 sont utilisés pour signaler une erreur. Donc, il vaut mieux faire:
au lieu de
la source
dnf check-update
renvoie 0 (aucune mise à jour), 100 (mises à jour disponibles) ou 1 (erreur).dnf
développeurs ont choisi cette voie, c'est leur choix. Mais encore, leur choix ne fait pas casser les spécifications :)$?
est un paramètre comme les autres. Vous pouvez enregistrer sa valeur à utiliser avant de finalement appelerexit
.la source
Alternative à la
if
déclaration expliciteAu minimum:
test $? -eq 0 || echo "something bad happened"
Achevée:
la source
Juste pour ajouter à la réponse utile et détaillée :
Si vous devez vérifier explicitement le code de sortie, il est préférable d'utiliser l'opérateur arithmétique
(( ... ))
, de cette façon:Ou utilisez une
case
déclaration:Réponse connexe sur la gestion des erreurs dans Bash:
la source