Bash fournit des structures de contrôle permettant de prendre des décisions lors de l’exécution d’un script. Ces décisions sont prises à l’aide de structures de contrôle et de la réalisation de tests.
En shell Bash on peut donc voir toute commande comme une expression conditionnelle dont le code retour est assimilé à vrai s’il vaut 0 et à faux dans les autres cas.
Deux syntaxes valides pour la commande test:
# Utilisation du mnémonique test "$a" -gt 10 # utilisation des crochets # NB: attention aux espace après crochet ouvrant # et avant crochet fermant [ "$a" -gt 10 ]
Les opérateurs sont des arguments de la commande test
Signification | Exemple d'utilisation | |
---|---|---|
-eq | equal | [ “$a” -eq “$b” ] |
-ne | not equal | [ “$a” -ne “$b” ] |
-gt | greater than | [ “$a” -gt “$b” ] |
-lt | less than | [ “$a” -lt “$b” ] |
-ge | greater or equal | [ “$a” -ge “$b” ] |
-le | less or equal | [ “$a” -le “$b” ] |
Des opérateurs dédiées aux chaînes de caractères
Signification | Exemple d'utilisation | |
---|---|---|
-n | vrai si chaîne non vide | [ -n “$str” ] |
-z | vrai si chaîne vide | [ -z “$str” ] |
== | vrai si les chaînes sont identiques | [ “$str1” == “$str2” ] |
== | vrai si les chaînes sont différentes | [ “$str1” != “$str2” ] |
\< | test infériorité entre chaînes | [ “$str1” \< “$str2” ] |
\> | test infériorité entre chaînes | [ “$str1” \> “$str2” ] |
Signification | Exemple d'utilisation | |
---|---|---|
-s | vrai si fichier non vide | [ -s “$file” ] |
-f | vrai si fichier existe et ordinaire | [ -f “$file” ] |
-d | vrai si répertoire existe | [ -d “$dir” ] |
-e | vrai si fichier existe | [ -e “$file” ] |
-s | vrai si fichier non vide | [ -s “$file” ] |
-r | vrai si fichier est accessible en lecture | [ -r “$file” ] |
-w | vrai si fichier est accessible en écriture | [ -w “$file” ] |
-x | vrai si fichier est exécutable | [ -x “$file” ] |
-nt | newer than f1 plus récent que f2 | [ “$f1”-nt “$f2” ] |
-ot | older than f1 plus ancien que f2 | [ “$f1”-ot “$f2” ] |
Les tests précédents peuvent être combinés à l'aide d'opérateurs logiques:
opérateur | Description | Exemple |
---|---|---|
! | négation, non logique | [ -f “$file” ] |
-a | opérateur binaire logique ET | [ -f “$file” -a -x “$file” ] |
-o | opérateur binaire logique OU | [ ] |
Il existe une version étendue de la commande test qui utilise des crochets doubles [[ ... ]]. L’idée de cette commande est d’accepter des expressions écrites comme les autres langages de programmation. Pour cela certains caractères du Bash perdent leur signification spéciale. Il s’ensuit que cette commande apporte quelques facilités d’écriture par rapport à la commande test.
# Pas besoin inhiber les caractères '<' et '>' # pour les tests sur les chaînes de caractères # entre les doubles crochets [[ "bateau" < "navire" ]]; echo $? # Opérateur logiques -a et -o remplacés par la syntaxe C '&&' et '||' [[ -e confidentiel && ! -r confidentiel ]]; echo $? # Pas d'inhibition des parenthèses [[ -x justexecutable && ! ( -r justexecutable || -w justexecutable ) ]] # Les expression arithmétiques sont évaluées # dans les doubles crochets [[ $a*3 -eq $b+2 ]] # Lorsqu’on utilise l’opérateur == ou l’opérateur != la chaîne de # caractères à droite de l’opérateur est comprise comme un motif. # Le pattern matching suit la même syntaxe que celle utilisée par la # substitution de nom de fichier [[ titu == t?t? ]] # Vérifie si la chaîne de caractères à gauche correspond à # l'expression régulière [[ "$str" =~ regex ]] [[ "$nombre" =~ ^[+-]?[[:digit:]]+$ ]];
La commande let qui s’abrègeant via (( ... )) permet de réaliser des calculs avec des expressions arithmétiques et en particulier des tests arithmétiques. Elle n'affiche rien mais son code retour peut être utilisé pour réaliser des tests.
$ a=2 $ b=4 # utilisation de test $ [ $a -lt $b ]; echo $? 0 # équivalent let (( a < b )); echo $? 0 # utilisation de test $ [ $a -eq $b ]; echo $? 1 # équivalent let permet d'utiliser la syntaxe C # pour la comparaison de valeurs numériques $ (( a == b )); echo $? 1
La raison est que si l’expression arithmétique n’est pas une expression conditionnelle, l’interprétation du code retour est délicate. En effet le code retour obtenu est 0 (vrai) si la valeur de l’expression calculée par let est différente de 0 et 1 (faux) si la valeur de l’expression vaut 0.
a=4 # la valeur calculée par let vaut 0, let retourne faux (1) $ (( a-4 )); echo $? 1 # La valeur calculée par let est différente de 0, le code retour # de let est 0 $ (( a-2 )); echo $? 0 $ (( a/10 )); echo $? 1 $ (( a/2 )); echo $? 0
Combinées aux structures de contrôle du Bash, ces commandes de test vont permettre de contrôler l'enchaînement des commandes d'un script.