Chapitre 25. Constructeurs de listes
Les constructions de << liste and >> et de << liste
or >> apportent un moyen de réaliser un certain nombre de commandes
consécutivement. Elles peuvent remplacer efficacement des
if/then complexes, voire imbriqués
ou même des instructions case.
Chaîner des commandes
- liste and
commande-1 && commande-2 && commande-3 && ...
commande-n |
Chaque commande s'exécute à son tour à condition que la dernière
commande ait renvoyé un code de retour
true (zéro). Au premier retour
false (différent de zéro), la chaîne de
commande s'arrête (la première commande renvoyant
false est la dernière à être exécutée).
Exemple 25-1. Utiliser une << liste and >> pour tester des arguments de la ligne de commande
#!/bin/bash
# "liste et"
if [ ! -z "$1" ] && echo "Argument #1 = $1" && [ ! -z "$2" ] && echo "Argument #2 = $2"
then
echo "Au moins 2 arguments passés au script."
# Toute la commande chaînée doit être vraie.
else
echo "Moins de 2 arguments passés au script."
# Au moins une des commandes de la chaîne a renvoyé faux.
fi
# Notez que "if [ ! -z $1 ]" fonctionne, mais que son supposé équivalent,
# if [ -n $1 ] ne fonctionne pas. Néanmoins, mettre entre guillemets corrige
# cela: if [ -n "$1" ] fonctionne. Attention!
# Il est mieux de toujours mettre entre guillemets les variables testées.
# Ceci accomplit la même chose, en utilisant une instruction if/then pure.
if [ ! -z "$1" ]
then
echo "Argument #1 = $1"
fi
if [ ! -z "$2" ]
then
echo "Argument #2 = $2"
echo "Au moins 2 arguments passés au script."
else
echo "Moins de 2 arguments passés au script."
fi
# C'est plus long et moins élémgant que d'utiliser une "liste et".
exit 0 |
Exemple 25-2. Un autre test des arguments de la ligne de commande en utilisant une << liste and >>
#!/bin/bash
ARGS=1 # Nombre d'arguments attendus.
E_BADARGS=65 # Valeur de sortie si un nombre incorrect d'arguments est passé.
test $# -ne $ARGS && echo "Usage: `basename $0` $ARGS argument(s)" && exit $E_BADARGS
# Si condition-1 vrai (mauvais nombre d'arguments passés au script),
# alors le reste de la ligne s'exécute et le script se termine.
# La ligne ci-dessous s'exécute seulement si le test ci-dessus a échoué.
echo "Bon nombre d'arguments passés à ce script."
exit 0
# Pour vérifier la valeur de sortie, faites un "echo $?" après la fin du script. |
Bien sûr, une liste and peut aussi
initialiser des variables à une valeur par
défaut.
arg1=$@ # Initialise $arg1 aux arguments de la ligne de commande, s'il y en a.
[ -z "$arg1" ] && arg1=DEFAUT
# Initialise à DEFAUT si non spécifié sur la ligne de commande. |
- liste or
commande-1 || commande-2 || commande-3 || ...
commande-n |
Chaque commande s'exécute à son tour aussi longtemps que la
commande précédente renvoie false. Au
premier retour true, la chaîne de
commandes s'arrête (la première commande renvoyant
true est la dernière à être exécutée).
C'est évidemment l'inverse de la << liste and >>.Exemple 25-3. Utiliser des << listes or >> en combinaison avec une << liste and >>
#!/bin/bash
# delete.sh, utilitaire pas-si-stupide de suppression de fichier.
# Usage: delete nomfichier
E_MAUVAISARGS=65
if [ -z "$1" ]
then
echo "Usage: `basename $0` nomfichier"
exit $E_MAUVAISARGS # Pas argument? On sort.
else
fichier=$1 # Initialisation du nom du fichier.
fi
[ ! -f "$fichier" ] && echo "Le fichier \"$fichier\" introuvable. \
Je refuse peureusement d'effacer un fichier inexistant."
# LISTE ET, pour donner le message d'erreur si le fichier est absent.
# Notez que le message echo continue sur la seconde ligne avec un échappement.
[ ! -f "$file" ] || (rm -f $file; echo "Fichier \"$file\" supprimé.")
# LISTE OU, pour supprimer le fichier si présent.
# Notez la logique inversée ci-dessus.
# La LISTE-ET s'exécute si vrai, la LISTE-OU si faux.
exit 0 |
 | Si la première commande dans une << liste
or >> renvoie true, elle
sera exécutée. |
 | Le code de sortie
d'une liste and ou d'une liste
or correspond au code de sortie de la dernière commande
exécutée. |
Les combinaisons intelligentes de listes << and >> et
<< or >> sont possibles, mais la logique pourrait rapidement
devenir difficile et nécessiter des phases de déboguages intensives.
false && true || echo false # false
# Même résultat avec
( false && true ) || echo false # false
# Mais *pas*
false && ( true || echo false ) # (rien ne s'affiche)
# Notez le groupement de gauche à droite et une évaluation des instructions,
# car les opérateurs logiques "&&" et "||" ont la même priorité.
# Il est mieux d'éviter de telles complexités, sauf si vous savez ce que vous
# faites.
# Merci, S.C. |
Voir Exemple A-8 et Exemple 7-4 pour des illustrations de l'utilisation de
listes and / or pour tester des variables.