Trucs de geek : les tests en bash

Si vous écrivez des scripts en bash, vous allez avoir bessoin de faire des tests. Cet article va vous présenter les principaux tests.

Il existe deux syntaxes permettant de réaliser des tests :

$ [ ]

ou

$ test expression

Le résultat d'un test sera toujours 0 si c'est vrai et 1 si c'est faux. Le résultat est contenu dans la varaible $?. Ainsi je peux faire le test suivant :

$ test 8 = 3

et récupérer le résultat en faisant :

$  echo $?

On peut faire des tests avec des varaibles :

$ a = 8

$ b = 3

$ [ a = b ]

$ echo $?

$ 1

Il est conseillé de protéger les varaibles par des guillemets doubles :

$ test "$a" = "$b"

Vous trouverez parfois ce type de test utilisé avec des préfixe :

$ test x"$a" = x"$b"

ainsi si a ou b n'est pas défini le test ne plante pas.

On fait souvent des tests sur les fichiers.Si on veut tester l'existence d'un fichier on écrira :

$ [ -e /home/jfd/test.txt ]

Voici la liste des principaux opérateurs sur les fichiers :

-e existence [ -e /home/jfd/test.txt ]
-s fichier non vide  
-f fichier normal  
-r le fichier est lisible  
-w le fichier est inscriptible  
-x le fichier est exécutbale  
-d le fichier est un répertoire  

Les test jusqu'à présents concernés des chaines de caractères. Si vous souhaitez comparer des données numériques, les opérateurs de tests sont différents.

Voici la liste des principaux opérateurs sur les nombres :

-eq égalité [ a -eq b ]
-ne inégalité  
-lt strictement inférieur  while [ $i -lt 5 ] ; do
  echo $i
  i=$((i + 1))
done
-le inférieur ou égal  
-gt strictement supérieur  
-ge supérieur ou égale  

Voici la liste des principaux opérateurs sur les chaines de caractères :

= égalité [ a = b ]
!= inégalité  
-z chaine vide  
-n chaine non vide  if [ -n "$3"  ] ; then echo 3  : $3  ; fi : si le 3ème arugument n'est pas vide on l'affiche

Voici la liste des principaux opérateurs sur les tests logiques :

! faux [ ! a ]
-a et

[ a -a b ]

Ce type de commutateur nous permet de combiner des tests

-o ou

[ a -o b ]

Ce type de commutateur nous permet de combiner des tests

Il existe aussi des tests spécifiques ayant trait aux fichiers :

-nt Test si le ficheir 1 est plus récent que le fichier 2
-ot Test si le fichier1 est plus vieux que le fichier 2
-ef Test si le fichier 1 est un lien vers le fichier 2

 

Quand je vous disais qu'il y a deux moyens de faire des tests, c'est peu faux. Quand on veut faire des tests multiples (je suis root et le fichier /etc/host existe) il faut recourir aux doubles crochets :

$ [ $EUID = '0' && -f /etc/hosts ]

bash: [: « ] » manquant

alors que :

$ [[ $EUID = '0' && -f /etc/hosts ]]

echo $?

1

alors qu'en root le résultat aurait été '0'.

Fait le 05/01/2016