Les shells possèdent tous les éléments d'un langage de programmation : tests, boucles, branchements conditionnels
Conditions
Les expressions conditionnelles sont extrêmement variées. Lorsque le test retourne 0 il est considéré comme vrai.
On emploie également la construction [[ expression ]] avec une paire de crochets ouvrants et une paire de crochets fermants entourés de blancs. Cet opérateur appelé commande de test étendue permet des évaluations plus complexes qu'avec [ ] . Par exemple les opérateurs de comparaison &&, >, < fonctionnent avec [[ .. ]], pas avec [ ].
Reconnaissons qu'il existe un certain flou que les meilleurs manuels ne lèvent pas (voir http://www.tldp.org/LDP/abs/html/testconstructs.html) et que seuls des essais peuvent répondre aux questions que l'on se pose.
Enfin on peut employer, en lieu et place d'expressions conditionnelles des expressions arithmétiques. Si elles retournent 0 on continuera le bloc if en séquence. Dans ce cas il faut employer une paire de parenthèses : (( expression arithmétique )) comme nous à propos des opérations mathématiques.
Les opérateurs les plus courants se divisent en plusieurs catégories :
- Comparaisons
- == égalité (deux égals)
- != différent
- >, <
- >=, <=
- Opérateurs booléens : || ou, && et
- Tests sur les fichiers :
- -e mon_fichier existence de mon_fichier
- -f mon_fichier mon_fichier est un fichier
- -d repert repert est un répertoire
- -r mon_fichier mon_fichier possède le droit de lecture pour le processus qui lance le script
- -w mon_fichier test du droit d'écriture
- -x mon_fichier test du droit d'exécution
Il en existe bien d'autres.
On peut combiner plusieurs tests. Par exemple :
[ ! –f rep ] retourne 0 (vrai) si rep n'est pas un fichier.
if
La syntaxe des tests conditionnels la plus courante est :
if [ expression conditionnelle ]
then
... instructions
fi
Attention à laisser un blanc de chaque coté des crochets [ ].
On utilise également l'expression plus compacte :
if [ expression conditionnelle ] ; then
... instructions
fi
où le symbole ; indique que deux instructions sont écrites sur la même ligne.
La syntaxe des tests alternés ou en cascade se déduit aisément :
if [ expression conditionnelle ] ; then
... instructions
elif [ expression conditionnelle ] ; then
... instructions
else
... instructions
fi
Branchements : case
L'instruction case permet de comparer la valeur d'une variable à des constantes et d'exécuter des blocs d'instructions correspondantes :
case $var in
1) instruction
... instructions ...;;
3) instruction
... instructions...;;
esac
Si var vaut 1 les instructions qui suivent seront exécutées jusqu'à rencontrer ;;, si var vaut 3 ce sera le deuxième bloc.
Si on avait omis ;; à la fin du premier bloc, le second serait automatiquement enchaîné.
Les constantes peuvent être également littérales :
case $var in
"essai")
... instructions ...;;
"run")
... instructions;;
*)
... action par défaut;;
esac
Une série de constantes peut déclencher la même action :
case 1|2|3) action
...;;
Boucles
On retrouve dans bash les trois boucles connues en langage C : while, for et until. La syntaxe obéit aux mêmes règles que pour if.
- while [ condition ] ; do
... instructions
done
- for var in x y z ...; do
... instructions
done
var prendra successivement toutes les valeurs de la série x, y, z.
Par exemple :
for var in ls *.c ; do
mv $var ../src
done
déplace les fichiers du répertoire où le script est exécuté, d'extension .c dans le répertoire ../src.
- Until [ expression ] ; do
... instructions
done
Copyright Yves Epelboin, université P.M. Curie, février 2003, MAJ
25 février, 2007