test (Unix)

Un article de Wikipédia, l'encyclopédie libre.

Test

Informations
Type Utilitaire UNIX (d)Voir et modifier les données sur Wikidata

test est une commande Unix qui permet de créer des expressions conditionnelles.

Syntaxe[modifier | modifier le code]

test Expression ou [ Expression ] ou [[ Expression ]]

Exemple : test -f /home/test ou [ -f /home/test ] ou [[ -f /home/test ]]

Description[modifier | modifier le code]

La commande test évalue l'expression passée en argument. Dans sa seconde forme, chaque crochet ([]) doit obligatoirement être séparé de la condition par un espace. Les fonctions et opérateurs sont traités comme des arguments différents par la commande test. L'expression conditionnelle doit faire référence à une condition à laquelle il est possible de répondre par vrai (true) ou faux (false).

Fonctions[modifier | modifier le code]

Les fonctions suivantes sont utilisées pour construire l'expression conditionnelle et retournent toutes vrai (true) si la condition est satisfaite :

Fonctions de caractéristiques de fichiers[modifier | modifier le code]

-b Fichier -- Fichier existe et est un fichier spécial en mode bloc.
-c Fichier -- Fichier existe et est un fichier spécial en mode caractère.
-d Fichier -- Fichier existe et est un répertoire.
-e Fichier -- Fichier existe.
-f Fichier -- Fichier existe et est de type ordinaire.
-g Fichier -- Fichier existe et le bit Set Group ID est actif.
-h Fichier -- Fichier existe et est un lien symbolique.
-k Fichier -- Fichier existe et le sticky bit est actif.
-L Fichier -- Fichier existe et est un lien symbolique (même chose que -h).
-p Fichier -- Fichier existe et est un tube nommé (named pipe, FIFO).
-r Fichier -- Fichier existe et est accessible en lecture.
-S Fichier -- Fichier existe et est un fichier spécial socket.
-s Fichier -- Fichier existe et a une taille non nulle.
-t Descripteur -- Le descripteur de fichier est ouvert et associé à un terminal.
-u Fichier -- Fichier existe et le bit Set User ID est actif.
-w Fichier -- Fichier existe et est spécifié comme étant accessible en écriture.
       Toutefois, le fichier ne sera pas accessible en écriture sur un système de fichier en
       lecture seule, même si le test indique vrai (true).
-x Fichier -- Fichier existe et est spécifié comme étant exécutable.
       Si le fichier spécifié est un répertoire, une valeur de retour vrai (true) signifie
       que le processus courant a la permission de parcourir ce répertoire.

Fonctions de chaînes de caractères[modifier | modifier le code]

-n Chaîne1         -- La longueur de la Chaîne1 n'est pas nulle.
-z Chaîne1         -- La longueur de la Chaîne1 est nulle.
Chaîne1 = Chaîne2  -- Chaîne1 et Chaîne2 sont identiques.
Chaîne1 != Chaîne2 -- Chaîne1 et Chaîne2 sont différentes.
Chaîne1            -- Chaîne1 n'est pas une chaîne de caractères nulle.

Fonctions numériques[modifier | modifier le code]

Entier1 -eq Entier2 -- Entier1 et Entier2 sont, algébriquement parlant, égaux.
Entier1 -ne Entier2 -- Entier1 n'est pas égal à Entier2.
Entier1 -gt Entier2 -- Entier1 est strictement supérieur à Entier2.
Entier1 -ge Entier2 -- Entier1 est supérieur ou égal à Entier2.
Entier1 -lt Entier2 -- Entier1 est strictement inférieur à Entier2.
Entier1 -le Entier2 -- Entier1 est inférieur ou égal à Entier2.

Comparaisons au niveau des fichiers[modifier | modifier le code]

Fichier1 -nt Fichier2 -- Fichier1 est plus récent que Fichier2.
Fichier1 -ot Fichier2 -- Fichier1 est plus ancien que Fichier2.
Fichier1 -ef Fichier2 -- Fichier1 et Fichier2 pointent vers le même fichier
      (par le biais de lien symbolique ou de lien matériel).

Ces comparaisons ne sont pas normalisées (en particulier si Fichier1 n'existe pas) mais sont souvent disponibles.

Opérateurs[modifier | modifier le code]

Toutes les fonctions ci-dessus peuvent être combinées avec les opérateurs suivants :

!  -- Opérateur unaire de la négation
-a -- Opérateur binaire ET
-o -- Opérateur binaire OU (l'opérateur -a est prioritaire sur l'opérateur -o)
\(Expression\) -- Les parenthèses pour effectuer des groupements doivent être
      échappées par des antislash (barre oblique inversée, \).

Codes de retour[modifier | modifier le code]

La commande test retourne les valeurs suivantes :

0  -- L'expression conditionnelle est vraie (true).
1  -- L'expression conditionnelle est fausse (false).
>1 -- Une erreur s'est produite.

Exemples[modifier | modifier le code]

Pour tester si un fichier existe et n'est pas vide[modifier | modifier le code]

if test -s "$1"
then echo "Le fichier $1 existe."
else echo "Le fichier $1 n'existe pas ou est vide."
fi

Si le fichier Nom_du_fichier dans le premier argument envoyé au script shell ($1) n'existe pas ou est vide, la commande test va retourner 1 et le script va afficher "Le fichier nom_du_fichier n'existe pas ou est vide.". Mais si au contraire le fichier existe et n'est pas vide, alors la commande test va retourner 0 et le script va afficher "Le fichier nom_du_fichier existe.".

Note : Il doit y avoir un espace entre l'option -s et le nom du fichier.

Les guillemets autour de $1 permettent de s'assurer que le test fonctionnera même si la valeur de $1 est nulle. Si les guillemets sont retirés et que $1 ne vaut rien, alors la commande test va retourner une erreur du type "test: argument expected.".

Pour vérifier qu'au moins un argument a été envoyé au script shell[modifier | modifier le code]

 if [ $# -lt 1 ]
 then
     echo "Erreur: il faut au moins un argument.";
     exit 2;
 fi

Cette fois-ci, on utilise la deuxième notation de la commande test (les crochets). Dans le script ci-dessus, $# correspond au nombre d'arguments envoyés sur la ligne de commande. On regarde donc si ce nombre est strictement inférieur (-lt) à 1 et si c'est le cas, on affiche une erreur et on arrête le script en retournant un code d'erreur 2.

Bibliographie[modifier | modifier le code]

  • Christine Deffaix Rémy, Programmation shell sous Unix/Linux : sh (Bourne), Ksh, bash, St Herblain, Editions ENI, coll. « Ressources Informatiques », , 442 p. (ISBN 978-2-7460-4233-9, lire en ligne), p.161 et suivantes

Voir aussi[modifier | modifier le code]