test (Unix)
testest une commandeUnixqui 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 parvrai(true) oufaux(false).
Fonctions
[modifier|modifier le code]Les fonctions suivantes sont utilisées pour construire l'expression conditionnelle et retournent toutesvrai(true) si la condition est satisfaite:
Fonctions de caractéristiques de fichiers
[modifier|modifier le code]-bFichier -- Fichier existe et est un fichier spécial en mode bloc. -cFichier -- Fichier existe et est un fichier spécial en mode caractère. -dFichier -- Fichier existe et est un répertoire. -eFichier -- Fichier existe. -fFichier -- Fichier existe et est de type ordinaire. -gFichier -- Fichier existe et le bitSet Group IDest actif. -hFichier -- Fichier existe et est unlien symbolique. -kFichier -- Fichier existe et lesticky bitest actif. -LFichier -- Fichier existe et est unlien symbolique(même chose que-h). -pFichier -- Fichier existe et est untube nommé(named pipe, FIFO). -rFichier -- Fichier existe et est accessible en lecture. -SFichier -- Fichier existe et est un fichier spécialsocket. -sFichier -- Fichier existe et a une taille non nulle. -tDescripteur -- Ledescripteur de fichierest ouvert et associé à un terminal. -uFichier -- Fichier existe et le bitSet User IDest actif. -wFichier -- 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 indiquevrai(true). -xFichier -- 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]-nChaîne1 -- La longueur de la Chaîne1 n'est pas nulle. -zChaî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 unechaîne de caractèresnulle.
Fonctions numériques
[modifier|modifier le code]Entier1-eqEntier2 -- Entier1 et Entier2 sont, algébriquement parlant, égaux. Entier1-neEntier2 -- Entier1 n'est pas égal à Entier2. Entier1-gtEntier2 -- Entier1 est strictement supérieur à Entier2. Entier1-geEntier2 -- Entier1 est supérieur ou égal à Entier2. Entier1-ltEntier2 -- Entier1 est strictement inférieur à Entier2. Entier1-leEntier2 -- Entier1 est inférieur ou égal à Entier2.
Comparaisons au niveau des fichiers
[modifier|modifier le code]Fichier1-ntFichier2 -- Fichier1 est plus récent que Fichier2. Fichier1-otFichier2 -- Fichier1 est plus ancien que Fichier2. Fichier1-efFichier2 -- Fichier1 et Fichier2 pointent vers le même fichier (par le biais delien symboliqueou delien matériel).
Ces comparaisons ne sont pasnormalisé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 desantislash(barre oblique inversée, \).
Codes de retour
[modifier|modifier le code]La commandetestretourne les valeurs suivantes:
0-- L'expression conditionnelle estvraie(true). 1-- L'expression conditionnelle estfausse(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]iftest-s"$1"
thenecho"Le fichier$1existe. "
elseecho"Le fichier$1n'existe pas ou est vide. "
fi
Si le fichier Nom_du_fichier dans le premier argument envoyé auscript 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-set le nom du fichier.
Les guillemets autour de$1permettent de s'assurer que le test fonctionnera même si la valeur de$1est nulle. Si les guillemets sont retirés et que$1ne 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[$#-lt1]
then
echo"Erreur: il faut au moins un argument.";
exit2;
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 »,,442p.(ISBN978-2-7460-4233-9,lire en ligne),p.161 et suivantes