Comment puis-je faire quelque chose comme ça dans bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Comment puis-je faire quelque chose comme ça dans bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Réponses:
Comment faire quelque chose sous condition si une commande réussit ou échoue
C'est exactement ce que dit la if
déclaration de bash :
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
Ajout d'informations à partir de commentaires: vous n'avez pas besoin d'utiliser la syntaxe [
... ]
dans ce cas. [
est lui-même une commande, presque équivalente à test
. C'est probablement la commande la plus courante à utiliser dans un if
, ce qui peut laisser supposer que cela fait partie de la syntaxe du shell. Mais si vous voulez vérifier si une commande a réussi ou non, utilisez-la directement avec if
, comme indiqué ci-dessus.
Éditer: Cité la question en haut pour plus de clarté (cette réponse n'apparaît pas en haut de la page).
then
sur une ligne séparée.
if ! command ; then ... ; fi
. [
est lui-même une commande, et ce n'est pas nécessaire dans ce cas.
if [ ! command ]
n'exécute pas command
; il traite command
comme une chaîne et la traite comme étant vraie car sa longueur est non nulle. [
est un synonyme de test
commande
Pour les petites choses que vous voulez voir si une commande shell fonctionne, vous pouvez utiliser la &&
construction:
rm -rf somedir && trace_output "Removed the directory"
De même pour les petites choses que vous souhaitez voir se produire lorsqu'une commande shell échoue, vous pouvez utiliser ||
:
rm -rf somedir || exit_on_error "Failed to remove the directory"
Ou les deux
rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"
Il est probablement peu judicieux de faire beaucoup avec ces constructions, mais elles peuvent parfois rendre le flux de contrôle beaucoup plus clair.
Vérifiez la valeur de $?
, qui contient le résultat de l'exécution de la commande / fonction la plus récente:
#!/bin/bash
echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo success
else
echo failed
fi
if [ $RESULT == 0 ]; then
echo success 2
else
echo failed 2
fi
if
idiome de Bash . Je préfère la réponse de Keith Thompson.
if
est de faire cela. Les conditions de contrôle de flux dans Bash examinent toutes $?
les coulisses; c'est ce qu'ils font. L'examen explicite de sa valeur devrait être inutile dans la grande majorité des cas et constitue généralement un anti-modèle pour débutant.
if ! cmd
c'est bien. Sinon, un arrangement commun consiste à utiliser une else
clause. Vous ne pouvez pas avoir un vide then
mais vous voyez parfois then : nothing; else
où le :
no-op est important. true
travaillerait là aussi.
Cela a fonctionné pour moi:
command && echo "OK" || echo "NOK"
si command
réussit, alors echo "OK"
est exécuté, et puisque cela réussit, l'exécution s'arrête là. Sinon, &&
est ignoré et echo "NOK"
est exécuté.
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
?
echo "OK"
pièce pouvait elle-même échouer, alors c'est mieux:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Il convient de noter que if...then...fi
et &&
/ ||
type d’approche concerne l’état de sortie renvoyé par la commande à tester (0 en cas de succès); Cependant, certaines commandes ne renvoient pas de 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
se ferme toujours à 0 s'il a reçu un fichier non existant en argument et find
ne peut pas 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 stderr
/ les stdin
messages, par exemple ceux renvoyés par file
commande, ou à analyser le résultat de la commande comme dans find
. À cette fin, une case
déclaration pourrait être utilisée.
$ 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
Le plus susceptible d’être entaché d’erreur était:
RR=$?
Maintenant, non seulement pour cette situation, mais pour d’autres que vous pourriez rencontrer, considérez:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Réponse: oui
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Réponse: non
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Réponse: non
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Réponse: oui
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Réponse: oui
Cela empêche toutes sortes d'erreurs.
Vous êtes probablement au courant de toute la syntaxe, mais voici quelques conseils:
"blank"
d'être nothing
.${variable}
.base-8
. Vous obtiendrez une erreur comme:
value too great for base (error token is "08")
pour les nombres ci-dessus 7
. C'est quand 10#
entre en jeu:10#
oblige le nombre à être base-10
.Tu peux le faire:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
ping
est capturée afin de l'exécuter en tant que commande. Mais parce que la sortie est redirigée vers / dev / null ce sera toujours la chaîne vide. Donc, vous n’exécutez rien dans un sous-shell, ce qui signifie que le statut de sortie précédent (du sous-shell de substitution de commande, c’est-à-dire de ping) sera conservé. De toute évidence, la bonne façon est if ping ...; then
ici.
Comme noté ailleurs dans ce fil, la question initiale se répond fondamentalement à elle-même. Voici une illustration montrant que des if
conditions peuvent également être imbriquées.
Cet exemple permet if
de vérifier si un fichier existe et s'il s'agit d'un fichier normal. Si ces conditions sont vraies, vérifiez si sa taille est supérieure à 0.
#!/bin/bash
echo "Which error log are you checking today? "
read answer
if [ -f /opt/logs/$answer*.errors ]
then
if [ -s /opt/logs/$answer*.errors ]
then
echo "Content is present in the $answer error log file."
else
echo "No errors are present in the $answer error log file."
fi
else
echo "$answer does not have an error log at this time."
fi
#!/bin/bash
if command-1 ; then
echo "command-1 succeeded and now running from this block command-2"
command-2
else
echo "command-1 failed and now running from this block command-3"
command-3
fi
Ceci pourrait être fait simplement de cette manière, car il $?
vous donne le statut de la dernière commande exécutée.
Donc ça pourrait être
#!/bin/sh
... some command ...
if [ $? == 0 ] ; then
echo '<the output message you want to display>'
else
echo '<failure message>'
fi