Est-il possible 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 marche pas. Je ne sais pas comment faire ça.
La valeur de retour est stockée dans $?
. 0 indique un succès, d'autres indique 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 future:
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
.
Si vous avez seulement besoin de savoir si la commande a réussi ou échoué, ne testez pas $?
, testez simplement la commande. Par exemple.:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
Et assigner la sortie à une variable ne change pas la valeur de retour (enfin, sauf si cela se comporte différemment quand 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.
command && echo OK || echo Failed
$? doit contenir le statut de sortie de la commande précédente, qui doit être zéro pour aucune 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 chaîner des commandes qui doivent dépendre les unes des autres. Donc, cd /nonexistant && echo success!
aurait pas écho à la réussite, car la commande est interrompue avant &&. Le corollaire de ceci est ||, où cd /nonexistant || echo fail
would écho échoue car cd a échoué. (cela devient utile si vous utilisez quelque chose comme || exit, qui mettra fin au script si la commande précédente a échoué.)
command && echo $? || echo $?
Comme mentionné dans de nombreuses autres réponses, un simple test de $?
suffira, comme ceci
if [ $? -eq 0 ]; then something; fi
Si vous voulez tester si la commande échec, vous pouvez utiliser une version plus courte dans bash
(mais peut-être surpasser) comme suit:
if (($?)); then something; fi
Cela fonctionne en utilisant le mode arithmétique (( ))
. Ainsi, si la commande a renvoyé success
, c'est-à-dire $? = 0
, le test est évalué à ((0))
, lequel teste comme false
. Sinon, il retournera true
.
Pour tester succès, vous pouvez utiliser:
if ! (($?)); then something; fi
mais ce n'est déjà pas beaucoup plus court que le premier exemple.
Pour corriger les erreurs vos commandes:
execute [INVOKING-FUNCTION] [COMMAND]
execute () {
error=$($2 2>&1 >/dev/null)
if [ $? -ne 0 ]; then
echo "$1: $error"
exit 1
fi
}
Inspiré en fabrication sans gaspillage:
Il convient de noter que le type d'approche if...then...fi
et &&
/||
concerne le statut de sortie renvoyé par la commande que nous voulons tester (0 en cas de succès); Cependant, certaines commandes ne renvoient pas un statut de sortie non nul si la commande échoue ou ne peut pas traiter les entrées. Cela signifie que les approches habituelles if
et &&
/||
ne fonctionneront pas pour ces commandes particulières.
Par exemple, sous Linux, GNU file
existe toujours avec 0 s'il a reçu un fichier inexistant en tant qu'argument et que find
n'a pas pu localiser le fichier spécifié par l'utilisateur.
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
Dans de tels cas, une solution potentielle consiste à lire les messages stderr
name __/stdin
name__, par exemple. ceux qui sont retournés par la commande file
ou analysent la sortie de la commande comme dans find
name__. Pour cela, vous pouvez utiliser l'instruction case
name__.
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
(Ceci est un report de ma propre réponse sur question connexe sur unix.stackexchange.com )