Ceci est une ancienne révision du document !


La commande test

La commande test existe sous tous les Unix, elle permet de faire un test et de renvoyer 0 si tout s'est bien passé ou 1 en cas d'erreur.

En mode console, faites man test pour connaître tous les opérateurs, en voici quelques-uns :

Opérateurs de test sur fichiers

Syntaxe Fonction réalisée
-e fichier renvoie 0 si fichier existe.
-d fichier renvoie 0 si fichier existe et est un répertoire.
-f fichier renvoie 0 si fichier existe et est un fichier 'normal'.
-w fichier renvoie 0 si fichier existe et est en écriture.
-x fichier renvoie 0 si fichier existe et est exécutable.
f1 -nt f2 renvoie 0 si f1 est plus récent que f2.
f1 -ot f2 renvoie 0 si f1 est plus vieux que f2.

Opérateurs de comparaison numérique

Syntaxe Fonction réalisée
$A -lt 5 renvoie 0 si $A est strictement inférieur à 5
$A -le 5 renvoie 0 si $A est inférieur ou égal à 5
$A -gt 5 renvoie 0 si $A est strictement supérieur à 5
$A -ge 5 renvoie 0 si $A est supérieur ou égal à 5
$A -eq 5 renvoie 0 si $A est égal à 5
$A -ne 5 renvoie 0 si $A est différent de 5

Les crochets

On peut raccourcir la commande test par des crochets. Exemple :

test -f /etc/passwd
echo $?
0
[ -f /etc/passwd ] 
echo $?
0

Affichera la valeur 0 : ce fichier existe, 1 dans le cas où le fichier /etc/passwd n'existe pas. Sous Unix, le code de retour est par convention et en général 0 s'il n'y a aucune erreur et différent de 0 dans les autres cas.

La syntaxe la plus appropriée dans de la programmation shell moderne est le double crochet :

[[ -f /etc/passwd ]]

Cela gère bien mieux les problèmes d'espaces dans les noms de fichiers, les erreurs etc… C'est une structure propre à bash (ksh, ?) qui est le shell par défaut dans la plupart des distributions Linux, et de Ubuntu en particulier. On garde en général des simples crochets pour les scripts shell qui doivent être à tout prix POSIX ( utilisation sur des Unix sans installation préalable de bash, comme BSD, Solaris… ) .

Les opérateurs logiques

Il y a en 3 :

  • le et logique : -a
  • le ou logique : -o
  • le non logique : !

Exemple :

echo "renverra 0 si les deux expressions sont vraies"
test expr1 -a expr2  
[ expr1 -a expr2 ]
Table de vérité de « -a »
Comparaison Résultat Calcul
0 et 0 0 0 × 0 = 0
0 et 1 0 0 × 1 = 0
1 et 0 0 1 × 0 = 0
1 et 1 1 1 × 1 = 1

Les deux assertions doivent être vérifiées pour que la condition le soit aussi.

Table de vérité de « -o »
Comparaison Résultat Calcul
0 ou 0 0 0 + 0 = 0
0 ou 1 1 0 + 1 = 1
1 ou 0 1 1 + 0 = 1
1 ou 1 1 1 + 1 = 1

Dès que l'une des deux assertions est vérifiée, la condition globale l'est aussi.

Exemple plus complet :

#!/bin/sh
 
echo -n "Entrez un nom de fichier: "
read file
if [ -e "$file" ]; then
        echo "Le fichier existe!"
else
        echo "Le fichier n'existe pas, du moins n'est pas dans le répertoire d'exécution du script"
fi

La seule chose qui prête à confusion est que l'on vérifie seulement si le fichier « file » est dans le répertoire où le script a été exécuté.

  • tutoriel/script_shell.1570444999.txt.gz
  • Dernière modification: Le 07/10/2019, 12:43
  • par BugFollower