L’enchaînement conditionnel de commandes consiste à conditionner l’exécution d’une commande au résultat d’une autre. Selon le code retour d’une première expression, une autre sera ou ne sera pas exécutée.
cmd1 && cmd2 | cmd2 n'est exécutée que lorsque cmd1 s'est terminée correctement (code retour 0) |
---|---|
cmd1 || cmd2 | cmd2 n'est exécutée que lorsque cmd1 s'est terminée en erreur ( code retour différent de 0) |
La commande if permet une écriture à la fois plus lisible et des contrôles plus élaborés. Il s’agit de conditionner l’exécution d’une suite de commandes au résultat d’une condition.
if condition then cmd1; cmd2; ... else cmd1; cmd2; ... fi
Il est possible d'imbriquer les structures conditionnelles:
if condition-1 then lignes-commandes-si-vrai-1 else if condition-2 then lignes-commandes-si-vrai-2 else if condition-3 then ... fi fi fi
Pour s'implifier l'écriture de ce type d'imbrication, le bash permet de contracter un else suivi d'un if via le mot clé elif
if condition-1 then lignes-commandes-si-vrai-1 elif condition-2 then lignes-commandes-si-vrai-2 elif condition-3 then ... fi
La structure case peut être une bonne alternative aux if imbriqués dans le cas où il s’agit de tester une valeur et d’exécuter différentes commandes en fonction de cette valeur.
case expression in motif1) lignes-commandes1;; motif2) lignes-commandes2;; ... motifN) lignes-commandesN;; esac
L'expression est évaluée afin d'obtenir une chaîne de caractères. Celle-ci est comparée à chaque motif dans l'ordre. A la première correspondance, les commandes sont exécutées, le case s'arrête en retournant le code retour de la dernière commande.
Si aucun des motifs ne correspond à la valeur de l’expression alors aucune commande n’est exécutée et le code retour de l’instruction case est 0. Toutefois s’il y a besoin d’exécuter des commandes dans le cas où aucun des motifs ne correspond on peut utiliser le motif * comme cas par défaut puisque celui-ci filtre n’importe quelle chaîne de caractères.
Si plusieurs cas doivent mener à l’exécution d’une même liste de commandes on peut écrire plusieurs motifs séparés par une barre verticale:
case expression in motif1 | motif2 | motif3) lignes-commandes123;; ... esac