Je m'excuse à l'avance s'il s'agit d'une question en double. J'ai fait un effort pour rechercher / vérifier avant de demander ici.
Je suis à l'aise avec l'écriture de lignes simples comme ceci:
foocommand && foocommand2 && foocommand3
L'idée étant que je souhaite que les commandes suivantes s'exécutent uniquement si la précédente a "réussi".
J'écris un script un peu long et ce one-liner n'est pas réalisable car il ressemble à un énorme bloc de code déroutant pour tout le monde.
Je veux espacer les commandes et écrire des commentaires entre elles dans le script. Comment puis-je faire cela et avoir encore l'équivalent de && là-dedans?
&&
ne signifie pas que la commande suivante fonctionnera si le précédent un a réussi. Cela signifie que la commande s'exécutera si le résultat collectif de toutes les commandes précédentes dans la liste de commandes est réussi. Vous le savez peut-être, mais les futurs lecteurs peuvent se méprendre.||
et&&
(par opposition à|
ou&
) est appelé court-circuit. Le comportement utilisé avec ces derniers opérateurs est appelé évaluation avide.a && b && c
ne s'exécutera queb
sia
réussit, donc "il ne s'exécute quec
sib
réussit" et "il ne s'exécute quec
sia
et lesb
deux réussissent" sont des instructions équivalentes:b
ne peut réussir que s'ila
réussit.a || b && c
est plus illustratif.true || false && echo hi
sortirahi
. La spécification se lit comme suit: Les opérateurs "&&" et "||" doivent avoir la même priorité et doivent être évalués avec l'associativité gauche.Réponses:
Vous pouvez le faire comme ceci:
J'espère avoir bien compris ce que vous avez demandé.
la source
Vous pouvez changer la ligne de shebang en
Après toute erreur, le script s'arrête.
la source
bash
partie bien sûr). Le shell POSIX prend un tas d'options applicables àset
. Ou vice versa?set
est un moyen de définir les options de ligne de commande du shell dans le script.-e
peuvent donc se comporter mal. Par exemple, vous ne voulez probablement pas que votre script se termine à chaque fois que vousdiff
deux fichiers non identiques. Vous pouvez, bien sûr, contourner cela en ajoutant|| true
(ou peut-être|| [ $? = 1 ]
) à de telles commandes, mais l'OP mentionne un "tout le monde" qui devra lire ce script, et a dit "tout le monde" ne sera probablement pas habitué à devoir faire face-e
.-e
sur le coup, jusqu'à ce qu'un administrateur de ma société continue de lancer mes scripts avecbash myscript.sh
, donc il a ignoré le-e
. Maintenant, tous mes scripts ont unset -e
dans la deuxième ligne.Si vous n'aimez pas l'
set -e
idée, vous pouvez peut-être inverser la logique.Plus utilement, remplacez
exit
par quelque chose pour imprimer un message d'erreur utile, puis quittez. Dans une fonction, bien sûr, vous voulezreturn
au lieu deexit
.la source
foocommand || exit
pour quitter avecfoocommand
le statut de sortie de si différent de zéro.Vous pouvez utiliser des
if else fi
blocs à la place.C'est un peu plus lisible.
Alternativement, vous pouvez simplement utiliser
\
pour briser votre grand liner en plusieurs lignesMais bien sûr, cela peut être déroutant pour l'œil non averti.
la source
\
soit nécessaire là-bas.Vous pouvez envisager d'utiliser des
if
instructions imbriquées . Une autre option consiste à utiliser des bouclés pour regrouper comme{ true && echo hi; } || echo huh
Mise à jour 1:
Voici un exemple sans nouvelles lignes / commentaires:
la source
Divisez chaque séquence de commandes en fonctions:
la source
J'aime toujours écrire une fonction "échec" qui me permet de spécifier la chose que j'allais faire lorsque l'échec s'est produit, puis d'utiliser le
||
modèle. Comme le suivant:la source