Comment vérifier le statut de sortie à l'aide d'une instruction if
Je me demandais quelle serait la meilleure façon de vérifier le statut de sortie dans une instruction if pour l'écho d'une sortie spécifique.
Je suis en train de penser qu'il soit
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
La question, je suis également à avoir, c'est que la sortie est de l'instruction avant l'instruction si simplement parce que c'est pour avoir que le code de sortie. Aussi, je sais que je suis en train de faire quelque chose de mal depuis la sortie serait évidemment de quitter le programme.
- Plaese poster votre script complet (ou au moins un champ d'application plus large). Le reste cela semble très bien.
- Si vous devez utiliser le code de sortie à partir d'un autre programme particulier d'invocation dans deux endroits différents, alors vous avez besoin pour la préserver - quelque chose le long des lignes de
some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}
Vous devez vous connecter pour publier un commentaire.
Chaque commande qui s'exécute a un statut de sortie.
Que l'enregistrement est en regardant l'état de sortie de la commande à fini, plus récemment, avant que la ligne fonctionne.
Si vous voulez votre script de sortie lors de ce test renvoie true (la commande précédente a échoué) puis vous mettez
exit 1
(ou autre) à l'intérieur queif
bloc après leecho
.Cela étant dit, si vous exécutez la commande et voulant tester sa sortie en utilisant ce qui suit est souvent plus straight-forward.
Ou de tourner autour de l'utilisation
!
pour la négationNoter cependant qu'aucun de ces soucis ce le code d'erreur est. Si vous savez que vous ne se soucient un code d'erreur spécifique, alors vous devez vérifier
$?
manuellement.a_command || return 1
exit
pour les autres cas (qui en fait trop dans une fonction et une source de script). Mais oui, c'est certainement un motif raisonnable si vous n'avez pas besoin spécifique de nettoyage ou de sortie supplémentaire.dash
, la valeur par défaut non-shell interactif dans de nombreux moderne distributions linux, ne se soucient pas de la distinction entrereturn
etexit
à l'intérieur d'exécution des scripts shell.dash
quitte le script, même si j'utilisereturn
en elle.if <command>
passe si le code de sortie est de 0. Dans toute autre langue, il serait dans l'autre sensif ! some_command | some_other_command
ignore le statut de some_command. Les deux commande la plupart des solutionsset -o pipefail
(susceptible de changer la fonctionnalité dans d'autres parties de votre programme) ou pour déplacer leif
déclarationif [[ ${PIPESTATUS[0]} -ne 0 ]]
en tant que distincte de suivi de commande (moche, mais fonctionnelle). Si vous utilisezset -e
ensuite, vous devrez également ajouter|| true
à l'extrémité de la conduite lors de l'utilisation de la deuxième solution depuis le retrait de la conduite à partir du flux de contrôle offerts parif
sinon entraîne immédiatement la sortie.Noter que les codes de sortie != 0 sont utilisés pour signaler l'erreur. Donc, il est mieux de le faire:
au lieu de
dnf check-update
renvoie la valeur 0 (pas de mises à jour), 100 (mises à jour disponibles) ou 1 (erreur).dnf
les développeurs ont choisi cette voie, c'est leur choix. Mais encore, leur choix n'est pas faire de la spécification d'être cassé 🙂$?
est un paramètre comme un autre. Vous pouvez enregistrer sa valeur à utiliser avant de finalement l'appel deexit
.Alternative à l'explicite
if
déclarationMini:
test $? -ne 0 || echo "something bad happened"
Complet:
Juste pour ajouter à l'utile et détaillée réponse:
Si vous avez à vérifier le code de sortie explicitement, il est préférable d'utiliser l'opérateur arithmétique,
(( ... ))
, de cette façon:Ou utiliser un
case
déclaration:Liées à répondre à propos de la gestion des erreurs dans Bash:
La réponse par Oo.oO est correct.
Si vous voulez aller plus loin, je l'utilise dans ma PS1 pour afficher le code de sortie de chaque commande, seulement si c'est une erreur:
Juste ajouter ces lignes à votre
.bashrc
si vous voulez le voir.