106 votes

Comment vérifier si $ ? n'est pas égal à zéro dans un script shell unix ?

J'ai un script qui utilise la commande test pour vérifier si $? (code de retour de la dernière commande exécutée) n'est pas égal à zéro. Le code est le suivant : -

$? est l'état de sortie de la dernière commande exécutée.

if (test $? -ne 0)
then
//statements//
fi

Cependant, cette méthode de validation ne fonctionne pas pour les chaînes de caractères, car elle entraîne une erreur de syntaxe. Veuillez suggérer une alternative appropriée à cette méthode.

110voto

mtk Points 3982

Mettez-le d'abord dans une variable et essayez ensuite de le tester, comme indiqué ci-dessous

ret=$?
if [ $ret -ne 0 ]; then
        echo "In If"
else
        echo "In Else"
fi

Cela devrait aider.


Edita: Si ce qui précède ne fonctionne pas comme prévu, il est possible que vous n'utilisiez pas l'option $? au bon endroit. Il doit être la ligne suivante après la commande dont vous devez récupérer le statut de retour. Même s'il y a une autre commande unique entre la cible et la récupération de son état de retour, vous récupérerez l'état de retour de cette commande intermédiaire et non celui que vous attendez.

64voto

Dennis Estenson Points 763

Vous n'avez pas besoin de tester si $? n'est pas 0 . L'obus fournit && y || afin que vous puissiez facilement bifurquer en fonction du résultat implicite de ce test :

some_command && {
    # executes this block of code,
    # if some_command would result in:  $? -eq 0
} || {
    # executes this block of code,
    # if some_command would result in:  $? -ne 0
}

Vous pouvez supprimer l'une ou l'autre branche, selon ce que vous voulez. Donc si vous voulez juste tester l'échec (c'est-à-dire $? -ne 0 ) :

some_command_returning_nonzero || {
    # executes this block of code when:     $? -ne 0
    # and nothing if the command succeeds:  $? -eq 0
}

Cependant, le code que vous avez fourni dans la question fonctionne, tel quel. Je suis confus que vous ayez obtenu des erreurs de syntaxe et que vous ayez conclu que $? était une chaîne de caractères. Il est fort probable que le code errant à l'origine de l'erreur de syntaxe n'ait pas été fourni avec la question. Cela est d'autant plus évident que vous affirmez que les solutions des autres ne fonctionnent pas non plus. Lorsque cela se produit, vous devez réévaluer vos hypothèses.

NB : Le code ci-dessus peut donner des résultats confus si le code à l'intérieur des accolades renvoie une erreur. Dans ce cas, utilisez simplement la fonction if à la place, comme ceci :

if some_command; then
    # executes this block of code,
    # if some_command would result in:  $? -eq 0
else
    # executes this block of code,
    # if some_command would result in:  $? -ne 0
fi

22voto

Yash Khare Points 313

Essayez ceci après l'exécution de votre script :

if [ $? -ne 0 ];
then
//statements//
fi

3voto

perreal Points 47912

Je ne sais pas comment tu as pu mettre une chaîne de caractères dans $? mais vous pouvez le faire :

if [[ "x$?" == "x0" ]]; then
   echo good
fi

3voto

leonard Points 31

Voici une solution que j'ai trouvée pour un problème similaire

exit_status () {
if [ $? = 0 ]
then
    true
else
    false
fi
}

l'usage :

do-command exit_status && echo "worked" || echo "didnt work"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X