EEIJ

Païou : Mandriva Linux depuis 2002. Aujourd'hui, c'est Mageia Linux


Sommaire


Conforme à XHTML 1.0 Strict Conforme à CSS!

On se lasse de tout, sauf de comprendre.
Attribué à Virgile.

Bash et les tests

Historique

12 mars 2012 : Création de cette page.

Difficulté

Pour : un esprit logique et curieux.

 Introduction

Il est souvent nécessaire de n'exécuter certaines instruction qu'au moment où des conditions sont remplies.
Il faut tester la valeur d'une variable, la présence d'un fichier ...

 La commande test

La commande qui permet de tester une expression peut s'écrire de deux manières :
test expression ou [ expression ]
Si l'expression est vraie, la valeur de retour est 0, si elle est fausse, la valeur est 1.

 Extension de test

Depuis bash 2.02, une extension des tests existe, avec des opérateurs plus proches de ceux des autres langages. Elle utilise des mots clé et n'est pas une commande, mais le résultat final est le même : 0 ou 1. Elle s'écrit :
[[ expression ]]et la valeur de retour est 0 si expression est vraie et 1 dans le cas contraire.

 Syntaxe courte d'un test

Les exemples sont donnés avec la dernière forme [[ ... ]], mais sont valables pour toutes les trois.
Par ailleurs, cette construction peut être utilisée pour toute autre commande dont le résultat est 0 ou 1.

Si l'expression est vraie, alors les instructions sont exécutées

[[ expression ]] && instruction; instruction ...

Si l'expression est fausse, alors les instructions sont exécutées

[[ expression ]] || instruction; instruction ...

Haut

 Syntaxe avec if then else elif fi

Le plus souvent, les tests sont utilisés avec une construction if/then/fi, if/then/else/fi ou même if/then/elif/then/else/fi.

Exemple1 :
if [[ expression ]]; then
  instructions1 ...
else
  instructions2 ...
fi
Si expression est vraie, alors ce sont les instructions1 qui sont exécutées. Dans le cas contraire, ce sont les instructions2.

Exemple2 :
if [[ expression1 ]]; then
  instructions1 ...
elif [[ expression2 ]]; then
  instructions2 ...
else
  instructions3 ...
fi
Si expression1 est vraie, les instructions1 sont exécutées.
Si expression1 est fausse, mais expression2 est vraie, alors, les instructions2 sont exécutées.
Si expression1 est fausse et expression2 est fausse, alors, les instructions3 sont exécutées.

Haut

 Opérateurs de test

Les opérateurs dans expression sont identiques pour les formes test expression et [ expression ]. Par contre, [[ expression ]] complète ces derniers.

 Tests de fichiers (les plus importants)

[[ -e /var/ftp/pub/welcome.msg ]]

le test est vrai si :

-e fichierle fichier existe

-f fichierle fichier existe et est un fichier ordinaire (ni un répertoire ni un fichier périphérique)

-s fichierle fichier existe et a une taille supérieure à zéro

-d fichierle fichier existe et est un répertoire

-b fichierle fichier existe et est un périphérique de type bloc (lecteur de disquettes, lecteur de cdroms, etc...)

-c fichierle fichier existe et est un périphérique de type caractère (clavier, modem, carte son, etc...)

-r fichierle fichier existe et dispose du droit de lecture (pour l'utilisateur ayant exécuté la commande)

-w fichierle fichier existe et dispose du droit d'écriture (pour l'utilisateur ayant exécuté la commande)

-x fichierle fichier existe et dispose du droit d'exécution (pour l'utilisateur ayant exécuté la commande)

-O fichierle fichier existe et vous êtes le propriétaire du fichier

-G fichierle fichier existe et vous faites partie du groupe propriétaire du fichier

 Tests sur les chaînes de caractères

le test est vrai si :

chaîne1 == chaîne2chaîne1 est égale à chaîne2. Le symbole =peut aussi être utilisé.

chaîne1 != chaîne2chaîne1 est différente de chaîne2

-z chaînela chaîne est vide (longueur nulle)

-n chaînela chaîne est non vide

chaîne1 < chaîne2chaîne1 se trouve avant chaîne_2 dans l'ordre lexicographique

chaîne1 > chaîne2chaîne1 se trouve après chaîne_2 dans l'ordre lexicographique

Haut

 Tests sur les nombres entiers

le test est vrai si :

valeur1 -eq valeur2valeur1 est égale à valeur2

valeur1 -ne valeur2valeur1 n'est pas égale à valeur2

valeur1 -gt valeur2valeur1 est plus grande que valeur2

valeur1 -ge valeur2valeur1 est plus grande que ou égale à valeur2

valeur1 -lt valeur2valeur1 est plus petite que valeur2

valeur1 -le valeur2valeur1 est plus petite que ou égale à valeur2

 Opérateurs logiques

! not : inverse le sens des tests (renvoie vrai si la condition est fausse). Exemple, avec la notation courte :
[ ! -r fichier ] && instruction; instruction ...

-o ou : le test est vrai si l'une ou l'autre des conditions est remplie

[ "$Var" == "valeur" -o "$Var2" == "valeur" ] && instruction; instruction ...

-a et : le test est vrai si les deux conditions sont simultanément remplies

[ "$Var" == "valeur" -a "$Var2" == "valeur" ] && instruction; instruction ...

et, bien sûr, vous avez la possibilité de combiner des ! avec des -o et des -a

 Spécificités de [[ expression ]]

L'expansion des chemins n'est pas réalisée à l'intérieur de [[ ]]

Avec les opérateurs == !=, chaîne2 est considérée comme un motif et accepte les caractères jocker * ? [...]
[[ $chaîne1 == *mot* ]]si chaîne1 contient le motif mot, ...
[[ $chaîne1 != *mai* ]]si chaîne1 ne contient pas le motif mai, ...
Attention ! Ne pas utiliser "$variable" ou '$variable' pour les variables.
Utiliser "lorsqu'il y a plusieurs mots" ou 'deux mots ou plus'.

Un opérateur supplémentaire existe depuis bash3, =~et la partie de droite est considérée comme étant une expression régulière. Exemples :
[[ 'deux billes' =~ ll ]] est vrai (contient ll)
[[ 'deux billes' =~ ^de ]] est vrai (commence par de)

Il est possible d'extraire des éléments :
[[ 'deux billes' =~ ^(.*)\ (.*) ]]
la première extraction est donnée par ${BASH_REMATCH[1]}, la deuxième par ${BASH_REMATCH[2]} ...
Attention : les espaces doivent être échappés (\) dans le motif.

Les opérateurs &&, ||, < et > fonctionnent à l'intérieur d'un test [[ ]]. Exemple :
[[ expression1 && expression2 ]]est vraie si les deux expressions sont vraies toutes les deux.

Haut