Ecrire des scripts bash est un sport de combat pour le codeur peu aguerri dans ce langage complexe et susceptible...
Un petit résumé des différentes possibilités de test sur des valeurs arithmétiques ou des chaînes de caractères (par ex dans une instruction "if") et des erreurs à éviter !
Une seule condition à tester :
cas 1) tests avec opérateur unaire : = ou -eq, != ou -ne, > ou -gt, < ou -lt )
- if [ $var = 1 ] # OK
- if [ $var -gt 0 ] # OK
- if [$var > 0] # Erreur il faut un espace après [ et avant ]
Tests avec variables définies avant ou non :
- var=1 # définition de $var, $nonvar n'est pas définie
- if [ $var = truc ] # OK ($var définie auparavant)
- if [ $nonvar = machin ] # erreur: $nonvar étant indéfinie, le test revient à: if [ = 1 ]
2 options pour éviter l’erreur lorsque l’on ne sait pas si la variable a été définie :
- if [ "$nonvar" = 1 ] # OK: protection de la variable par " "
- if [[ $nonvar = 1 ]] # OK
La construction [[ ]]
est la commande étendue de [ ] dans Bash.
cas 2) tests avec double opérateurs : ==, !==, >=, <=
- if (( $var == 1 )) # OK
- if (( $var <= 1 )) # OK
- if (( $var = 1 )) # erreur: = est utilisé comme opérateur d'affectation avec (( ))
- if (( $var -gt 1 )) # erreur: opérateurs -gt, -lt... non disponibles avec (( ))
- if [ $var >= 0 ] # erreur: double parenthèse obligatoire avec ces opérateurs
La construction (( ))
évalue une expression arithmétique.
cas 3) tests spécifiques des chaînes de caractères
- if [ -n "$var" ] # la chaîne $var n'est pas de longueur nulle
- if [ -z "$var" ] # la chaîne $var est de longueur nulle (est donc '')
Test deux conditions
- if [ $var = 0 -o $var = 1 ] # OK (-o : condition OU)
- if [ $var > "0" -a $var = "1" ] # OK (-a : condition AND)
Variables définies ou non :
- var=oui # $var est définie, $nonvar ne l'est pas
- if [ $var = non -o $var = n ] # OK
- if [ $nonvar = non -a $var = n ] # erreur: $nonvar pas définie
- if [ "$nonvar" = "non" -o "$var" = "n" ] # OK
- if [[ $nonvar= "non" -o $var= "n" ]] # erreur
Dans le cas d’un test double, la protection des variable par " " est la seule option pour éviter les erreurs de variables non définies.
Tests sur les objets du système de fichiers
Les opérateurs de tests disponibles sont, pour les les objets du système de fichiers :
exemples de code :
- if [ -e $FILE ]
"si $FILE est un fichier"
- if [ ! -d mon_rep ]
"si le répertoire mon_rep n’existe pas"
Liste des tests :
Test | Descriptif |
---|---|
-e | vrai si $FILE existe |
-s | vrai si $FILE existe et si sa taille est supérieure à zéro |
-f | vrai si $FILE est un fichier |
-r | vrai si $FILE est un fichier avec la permission (read) |
-w | vrai si $FILE est un fichier avec la permission (write) |
-x | vrai si $FILE est un fichier avec la permission (execute) |
-d | vrai si $FILE est un répertoire |
-L | vrai si $FILE est un lien symbolique |
-O | vrai si on est le owner de $FILE |
-G | vrai si on a le même groupe que $FILE |
-N | vrai si le fichier a été modifié depuis sa dernière ouverture |
f1 -nt f2 | le fichier f1 est plus récent que f2 |
f1 -ot f2 | le fichier f1 est plus vieux que f2 |
Tests d’appartenance à une liste (=array une dimension)
Bien que ça ne soit que peu utilisé en bash, il est possible de créer des tableaux à une dimension (= liste) et de tester si une variable appartient à une liste.
- # creation de la liste (éléments séparés par un espace)
- ma_liste=(toto titi tata)
- ma_variable=tata
- # test d'appartenance de $variable à la liste (ou pas!)
- if [[ " ${ma_liste[@]} " =~ " ${ma_variable} " ]]; then
- # instructions à éxecuter si $ma_variable appartient à la liste
- fi
- if [[ ! " ${ma_liste[@]} " =~ " ${ma_variable} " ]]; then
- # instructions à éxecuter si $ma_variable n'appartient pas à la liste
- fi
Références :
- man test : http://ss64.com/bash/test.html
- la référence de base : https://fr.wikibooks.org/wiki/Programmation_Bash/Tests
- pour aller plus loin : http://abs.traduc.org/abs-5.0-fr/ch07.html
- résumé des différents opérateurs de tests (arithmétiques, chaînes de caractères, système de fichiers et dossiers) : http://techietent.blogspot.fr/2013/03/bash-test-operators.html
- la bidouille pour tester l’appartenance à une liste sans itérer dessus : https://stackoverflow.com/a/15394738