Les opérateurs && et || autorisent l’exécution conditionnelle d’une commande cmd suivant la valeur du code de retour de la dernière commande précédemment exécutée.
Opérateur : &&
Syntaxe : cmd1 && cmd2
Le fonctionnement est le suivant : cmd1 est exécutée et si son code de retour est égal à 0, alors cmd2 est également exécutée.
$ grep daemon pass && echo daemon existe daemon:x:1:1:daemon:/usr/sbin:/bin/sh daemon existe $
La chaîne de caractères daemon est présente dans le fichier pass, le code de retour renvoyé par l’exécution de grep est 0 ; par conséquent, la commande echo daemon existe est exécutée.
Opérateur : ||
Syntaxe : cmd1 || cmd2
cmd1 est exécutée et si son code de retour est différent de 0, alors cmd2 est également exécutée.
Pour illustrer cela, supposons que le fichier tutu n’existe pas.
$ ls pass tutu ls: impossible d'accéder à tutu: Aucun fichier ou dossier de ce type pass $ $ rm tutu || echo tutu non efface rm: impossible de supprimer «tutu»: Aucun fichier ou dossier de ce type tutu non efface $
Le fichier tutu n’existant pas, la commande rm tutu affiche un message d’erreur et produit un code de retour différent de 0 : la commande interne echo qui suit est donc exécutée.
Combinaisons d’opérateurs && et ||
Les deux règles mentionnées ci-dessus sont appliquées par le shell lorsqu'une suite de commandes contient plusieurs opérateurs && et ||. Ces deux opérateurs ont même priorité et leur évaluation s’effectue de gauche à droite.
$ ls pass || ls tutu || echo fini aussi pass $
Le code de retour de ls pass est égal à 0 car pass existe, la commande ls tutu ne sera donc pas exécutée. D’autre part, le code de retour de l’ensemble ls pass || ls tutu est le code de retour de la dernière commande exécutée, c’est à dire est égal à 0 (car c’est le code de retour de ls pass), donc echo fini aussi n’est pas exécutée.
Intervertissons maintenant les deux commandes ls:
$ ls tutu || ls pass || echo fini ls: impossible d'accéder à tutu: Aucun fichier ou dossier de ce type pass $
Le code de retour de ls tutu est différent de 0, donc ls pass s’exécute. Cette commande renvoie un code de retour égal à 0, par conséquent echo fini n’est pas exécutée.
Combinons maintenant opérateurs && et || :
$ ls pass || ls tutu || echo suite et && echo fin pass fin $
La commande ls pass est exécutée avec un code de retour égal à 0, donc la commande ls tutu n’est pas exécutée : le code de retour de l’ensemble ls pass || ls tutu est égal à 0, la commande echo suite et n’est pas exécutée. Le code de retour de ls pass || ls tutu || echo suite et est égal à 0, donc la commande echo fin est exécutée !
Bien sûr, un raisonnement analogue s’applique avec l’opérateur && :
$ ls pass && ls tutu && echo fini pass ls: impossible d'accéder à tutu: Aucun fichier ou dossier de ce type $ $ ls tutu && ls pass && echo suite et && echo fin ls: impossible d'accéder à tutu: Aucun fichier ou dossier de ce type $ $ ls pass && ls tutu && echo suite et || echo fin pass ls: impossible d'accéder à tutu: Aucun fichier ou dossier de ce type fin $