Comment puis-je faire quelque chose comme ça dans bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
bash
control-flow
Michael Mrozek
la source
la source
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 pascommand
; il traitecommand
comme une chaîne et la traite comme étant vraie car sa longueur est non nulle.[
est un synonyme detest
commandePour les petites choses que vous voulez voir si une commande shell fonctionne, vous pouvez utiliser la
&&
construction:De même pour les petites choses que vous souhaitez voir se produire lorsqu'une commande shell échoue, vous pouvez utiliser
||
:Ou les deux
Il est probablement peu judicieux de faire beaucoup avec ces constructions, mais elles peuvent parfois rendre le flux de contrôle beaucoup plus clair.
la source
Vérifiez la valeur de
$?
, qui contient le résultat de l'exécution de la commande / fonction la plus récente:la source
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 uneelse
clause. Vous ne pouvez pas avoir un videthen
mais vous voyez parfoisthen : nothing; else
où le:
no-op est important.true
travaillerait là aussi.Cela a fonctionné pour moi:
si
command
réussit, alorsecho "OK"
est exécuté, et puisque cela réussit, l'exécution s'arrête là. Sinon,&&
est ignoré etecho "NOK"
est exécuté.la source
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 habituellesif
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 etfind
ne peut pas localiser le fichier spécifié par l'utilisateur.Dans de tels cas, une solution potentielle consiste à lire
stderr
/ lesstdin
messages, par exemple ceux renvoyés parfile
commande, ou à analyser le résultat de la commande comme dansfind
. À cette fin, unecase
déclaration pourrait être utilisée.la source
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:
variable définie:
$ 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
variable indéfinie:
$ 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'êtrenothing
.${variable}
.base-8
. Vous obtiendrez une erreur comme:value too great for base (error token is "08")
pour les nombres ci-dessus7
. C'est quand10#
entre en jeu:10#
oblige le nombre à êtrebase-10
.la source
Tu peux le faire:
la source
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 estif 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.la source
la source
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
la source