Ici, il montre comment utiliser le ||
et &&
dans une seule ligne pour concaténer l'exécution des commandes: Comment puis-je vérifier les erreurs apt-get dans un script bash?
J'essaie d'arrêter l'exécution d'un script si une certaine condition échoue,
par exemple
false || echo "Obvious error because its false on left" && exit
Ici, il imprime Obvious error because its false on the left
et quitte la console qui est ce que je voulais.
true || echo "This shouldn't print" && exit
Ici, il n'y a pas d'impression d'écho mais la exit
commande s'exécute également, c'est-à-dire que la console est fermée, la exit
commande ne devrait-elle pas s'exécuter car la commande d'écho à droite n'a pas été exécutée? Ou est-ce par défaut une déclaration considérée comme fausse du côté gauche d'un &&
opérateur?
Edit: j'aurais dû le mentionner avant, mon objectif était de faire écho à l'erreur et de sortir si ce n'était pas clair. par rapport à mon cas spécifique de capture d'erreurs lors du regroupement des conditions à l'aide de && et ||, la réponse @ bodhi.zazen résout le problème.
La réponse @takatakatek clarifie le contrôle de flux et les liens du guide bash sont excellents
@muru answer a une bonne explication de pourquoi ne pas utiliser set -e si vous voulez que des messages d'erreur personnalisés soient lancés avec des alternatives d'utilisation de perl et trap qui, je pense, est un moyen plus robuste et me vois l'utiliser à partir de mon deuxième script bash!
la source
Réponses:
Vous voulez probablement (comme l'a souligné Steeldriver)
Sinon, votre script lit un conditionnel à la fois
a ou b, puis quittez
Je pense que vous voulez un ou (b et sortir)?
la source
{ ... ; }
(comme l'a suggéré @steeldriver), sinon laexit
seule sortie du sous-shell, et le shell parent continue d'exécuter le script.Le problème est que || et && ne saute qu'une strophe suivante d'une chaîne de commandes lorsque la condition échoue. Si vous écrivez une structure de blocs complète, cela est parfaitement logique. Ce que vous avez écrit devient ceci:
Ce que vous voulez c'est:
Lorsque vous utilisez les opérateurs conditionnels de raccourci de Bash, il est préférable d'éviter de les mélanger. La logique est beaucoup plus facile à comprendre pendant que vous l'écrivez, et vos lecteurs apprécieront votre bon style.
la source
if ... then ... elif ... else ... fi
blocs entièrement exprimés . Je soupçonne que vous ne savez peut-être pas que Bash n'a pas de vrais types booléens vus dans des langages plus sophistiqués. Si l'état de sortie d'une commande est 0 (zéro), Bash le traite comme vrai / succès . Si l'état de sortie est différent de zéro, Bash le traite comme faux / échec .Le moyen le plus simple d'échouer en cas d'erreur est d'utiliser l'
-e
option de bash (set -e
ou/bin/bash -e
dans le shebang). Cependant, cela ne facilite pas l'envoi de messages d'erreur personnalisés. Il y a quelques idiomes qui pourraient le rendre plus simple:die
à la PerlPerl a une
die
commande très pratique qui imprime un message à stderr et déclenche une exception, ce qui entraîne généralement la fin du script. Vous pouvez émuler ceci:trap
ERR
La
trap <command>
commande peut être utilisée pour exécuter une commande lorsqu'un signal est reçu, ou lorsque vous quittez le script (trap ... EXIT
), ou lorsqu'une commande renvoie une erreur (trap ... ERR
). Donc quelque chose comme:Puis:
Dans les deux cas, je suggère d'utiliser au moins
exit 1
pour indiquer que le script a échoué . Une plaineexit
utilisera le statut de sortie de la commande précédente, qui dans ces cas serait les commandesecho
orprintf
, qui réussiraient généralement. Enregistrer l'état de sortie de la commande défaillante comme je l'ai fait ici serait une bonne chose.la source
Vous pouvez essayer de tester un peu le démarrage du script avec
Le -e garantit que le script se termine au moment où quelque chose retourne faux. Une défaillance spécifique peut alors être évitée avec
something || true
la source