L'opérateur && exécute la commande suivante si la commande précédente a réussi, (code de sortie retourné ($?) 0 = logique vrai).
Dans la forme A && B || C
, la commande (ou la condition) A est évaluée et si A renvoie vrai (succès, code de sortie 0) alors la commande B est exécutée. Si A échoue (retourne donc faux - code de sortie autre que 0) et / ou B échoue (retourne faux ), alors la commande C sera exécutée.
L' &&
opérateur est également utilisé comme ET dans les vérifications de condition et l'opérateur ||
fonctionne comme OU dans les vérifications de condition.
Selon ce que vous voulez faire avec votre script, le formulaire A && B || C
peut être utilisé pour des vérifications de conditions comme votre exemple ou peut être utilisé pour chaîner des commandes et garantir une série de commandes à exécuter si les commandes précédentes avaient un code de sortie 0 réussi .
Voilà pourquoi il est fréquent de voir des commandes telles que :
do_something && do_something_else_that_depended_on_something
.
Exemples:
apt-get update && apt-get upgrade
si la mise à jour échoue, la mise à niveau n'est pas exécutée (est logique dans le monde réel ...).
mkdir test && echo "Something" > test/file
La partie echo "Something"
ne sera exécutée qu'en cas de mkdir test
succès et l'opération a renvoyé le code de sortie 0 .
./configure --prefix=/usr && make && sudo make install
Habituellement trouvé lors de la compilation de travaux pour enchaîner les commandes dépendantes nécessaires.
Si vous essayez d'implémenter les "chaînes" ci-dessus avec if - alors - sinon vous aurez besoin de beaucoup plus de commandes et de vérifications (et donc plus de code à écrire - plus de choses à se tromper) pour une tâche simple.
Gardez également à l'esprit que les commandes chaînées avec && et || sont lus par shell de gauche à droite. Vous devrez peut-être regrouper les commandes et les vérifications de condition avec des crochets pour dépendre de la prochaine étape de la sortie réussie de certaines commandes précédentes. Par exemple, voyez ceci:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
Ou un exemple réel:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
Gardez à l'esprit que certaines commandes renvoient des codes de sortie différents en fonction du processus exécuté ou retournent des codes différents en fonction de leurs actions (par exemple, la commande GNU diff
renvoie 1 si deux fichiers diffèrent et 0 si ce n'est pas le cas). Ces commandes doivent être traitées avec soin dans && et || .
Aussi juste pour avoir tout le puzzle ensemble, gardez à l'esprit la concaténation des commandes à l'aide de l' ;
opérateur. Avec un format A;B;C
toutes les commandes seront exécutées en série quel que soit le code de sortie de la commande A
et B
.