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.
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.
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
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 !!!
Je ne sais pas comment tu as eu une ficelle dans $?
mais vous pouvez faire:
if [[ "x$?" == "x0" ]]; then
echo good
fi
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"
function assert_exit_code {
rc=$?; if [[ $rc != 0 ]]; then echo "$1" 1>&2; fi
}
...
execute.sh
assert_exit_code "execute.sh has failed"
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"
if [ $var1 != $var2 ]
then
echo "$var1"
else
echo "$var2"
fi
<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