340 votes

Comment vérifier si une commande a réussi ?

Existe-t-il un moyen de vérifier s'il y a une erreur dans l'exécution d'une commande ?

Exemple :

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

J'ai déjà essayé de le faire mais il semble que ça ne fonctionne pas. Je ne sais pas comment faire.

502voto

Lekensteyn Points 162346

La valeur de retour est stockée dans $? . 0 indique un succès, les autres indiquent une erreur.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Comme toute autre valeur textuelle, vous pouvez la stocker dans une variable pour une comparaison ultérieure :

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Pour les opérateurs de comparaison possibles, voir man test .

122voto

Steve Karg Points 11

Si vous avez seulement besoin de savoir si la commande a réussi ou échoué, ne vous embêtez pas à tester $? il suffit de tester la commande directement. Par exemple :

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

Et l'assignation de la sortie à une variable ne change pas la valeur de retour (enfin, à moins qu'elle ne se comporte différemment lorsque stdout n'est pas un terminal, bien sûr).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals explique if de manière plus détaillée.

45voto

Abraham Sanchez Points 467
command && echo OK || echo Failed

23voto

Shaun Points 537

$ ? doit contenir l'état de sortie de la commande précédente, qui doit être zéro pour une absence d'erreur.

Donc, quelque chose comme ;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

Dans la plupart des cas, il est plus facile d'utiliser la construction && pour enchaîner des commandes qui doivent dépendre les unes des autres. Ainsi, cd /nonexistant && echo success! serait no echo success car la commande s'interrompt avant &&. Le corollaire de ceci est ||, où cd /nonexistant || echo fail serait echo fail parce que cd a échoué. (cela devient utile si vous utilisez quelque chose comme ||exit, qui terminera le script si la commande précédente a échoué).

6voto

modrobert Points 77
command && echo $? || echo $?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X