Outils pour utilisateurs

Outils du site


cours:informatique:fun_mooc:maitrise_du_bash_univ-reunion:420_expressions_et_conditions

Expressions conditionnelles et tests

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.

La commande test

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 ]

Opérateurs de comparaison arithmétique

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” ]

Opérateurs de comparaison sur chaînes de caractères

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” ]
Les métacaractères '<' et '>' sont inhiber car ils ont une signification de redirection pour le shell. Ils doivent être passés à la commande test sans être interprétés en amont par le Bash.

Opérateur de comparaison sur fichiers

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” ]

Opérateurs logiques

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 [ ]

Test étendu

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:]]+$ ]];

Test numérique via la commande let

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
Il est déconseillé d'utiliser la commande let en dehors d'expressions arithmétiques conditionnelles.

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.

cours/informatique/fun_mooc/maitrise_du_bash_univ-reunion/420_expressions_et_conditions.txt · Dernière modification : 2021/04/05 11:37 de 77.192.232.26