Païou : Mandriva Linux depuis 2002. Aujourd'hui, c'est Mageia Linux
On se lasse de tout, sauf de comprendre.
Attribué à Virgile.
12 mars 2012 : Création de cette page.
Pour : un esprit logique et curieux.
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 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.
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.
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 ...
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.
Les opérateurs dans expression sont identiques pour les formes test expression et [ expression ]. Par contre, [[ expression ]] complète ces derniers.
[[ -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
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
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
! 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
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.