web-dev-qa-db-fra.com

Comment vérifier si $? n'est pas égal à zéro dans les scripts 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 comme suit: -

$? 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, car get error est une erreur de syntaxe. Veuillez suggérer une alternative appropriée à cela.

34
user1466466

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

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

Cela devrait aider.


Edit: Si ce qui précède ne fonctionne pas comme prévu, il est possible que vous n'utilisiez pas $? au bon endroit. Il doit s'agir de la ligne suivante après la commande dont vous devez connaître l'état de retour. Même s'il existe une autre commande unique entre la cible et que vous attrapez son état de retour, vous récupérerez le return_status de cette commande intermédiaire et non celle attendue.

47
mtk

Je n'arrive pas à croire que personne ne l'ait mentionné depuis presque quatre ans que cette question a été posée. Vous n'avez vraiment pas besoin de tester si $? n'est pas 0. Le shell fournit && et || afin que vous puissiez facilement créer une branche en fonction du résultat implicite de ce test.

Par exemple:

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 vos préférences. Donc, si vous voulez juste tester l’échec (c.-à-d. $? -ne 0):

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

Toutefois, le code que vous avez fourni dans la question fonctionne tel quel. Je suis confus que vous avez des erreurs de syntaxe et conclu que $? était une chaîne. Il est fort probable que le code erroné à l'origine de l'erreur de syntaxe n'était pas fourni avec la question. Cela est d'autant plus évident que vous prétendez que les solutions de personne d'autre ne fonctionnent non plus. Lorsque cela se produit, vous devez réévaluer vos hypothèses.

NB: Le code ci-dessus peut donner des résultats déroutants si le code à l'intérieur des accolades renvoie une erreur. Dans ce cas, utilisez simplement la commande 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
21
destenson

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

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

J'espère que ça aide ... À la vôtre !!!

6
Yash Khare

Je ne sais pas comment tu as eu une ficelle dans $? mais vous pouvez faire:

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

Ceci est une solution qui est venue avec un problème similaire

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

usage:

do-command exit_status && echo "worked" || echo "didnt work"
1
leonard
function assert_exit_code {
    rc=$?; if [[ $rc != 0 ]]; then echo "$1" 1>&2; fi
}

...

execute.sh

assert_exit_code "execute.sh has failed"
0
Mykhaylo Adamovych

met set -o pipefail au début d'un script, pour renvoyer tout échec

si vous le faites, le test échoue mais le tee ne le fait pas. Par défaut $? prend juste les dernières commandes avec succès, dans ce cas la commande "tee"

test | tee /tmp/dump
[ $? -ne 0 ] && echo "failed"
0
Ab Bennett
if [ $var1 != $var2 ] 
then 
echo "$var1"
else 
echo "$var2"
fi
0
dilshad
<run your last command on this line>
a=${?}
if [ ${a} -ne 0 ]; then echo "do something"; fi

utilisez la commande que vous voulez utiliser à la place du echo "do something" commande

0
MelBurslan