Programmation shell

Programmation du shell : Tests et conditions

Evaluer la situation
Première publication : .
Mise en ligne: 9 octobre 2003.
Modifié le : 20 janvier 2004.
Par Frédéric Guerrier
Programmation du shell : Tests et conditions, Shell, , tcsh, , Script, , Tests, , Programmation

Il serait difficile d’imaginer un langage de programmation dépourvu de systèmes de contrôles, de tests et de conditions ; la programmation de scripts shells ne déroge pas à la règle et propose différentes solutions pour parvenir à ses fins.

Il convient de préciser que chaque shell à sa propre syntaxe, ce qui rend les choses un peu compliquées il faut bien l’avouer. Nous nous interressons ici à tcsh (1), la syntaxe sera différente en bash (2) ou en shell c (3) par exemple. Les concepts restent toutefois les mêmes. Cet article tente d’expliquer ces concepts. Par ailleur, il est bien évident que les subtilités de la programmation vont bien plus loin que dans ces lignes, cet article étant surtout un mémo en quelque sorte...

La condition : if

La plupart des langages de programmation proposent la structure de contrôle "if...then...else", qui est souvent utilisée pour faire des tests en tous genres.

Nous allons écrire un petit script qui va effectuer un test pour vérifier le nombre d’argument(s) présent(s) à la suite d’une commande à l’aide de la condition if :

Dans le cas ou nous n’aurions pas d’autres choix à tester, donc pas besoin de placer de else, si la condition est verifiée, elle exécute la commande et le script se poursuit.

Les structures conditionnelles

La condition d’exécution des structures conditionnelles qui suivent est qu’une commande aboutisse, c’est à dire que sa valeur de retour soit 0.

La commande qui sert de condition peut être une commande composée, en particulier on utilise souvent une formule du type "commande1 && commande2" ou "commande1 || commande2" (4).

La condition peut être inversée si on fait précéder la commande d’un point d’exclamation. Donc " ! commande" signifie que la condition est vraie si la commande échoue. Attention, le point d’exclamation s’applique uniquement à la commande qui le suit ; pour qu’il s’applique à une commande composée, il faut l’encadrer avec des accolades (ou des parenthèses).

Exemples :


La condition : switch ... case

Losque l’on a beaucoup de cas à traiter, il devient vite difficile d’utiliser la condition if, car elle produit un code peu lisible. Il existe donc une méthode plus pratique que nous allons étudier à travers la structure de base de la condition switch ... case :

Nous utilisions la condition switch ... case sur le premier argument de la ligne de commande (1).

switch définit les valeurs sur lesquelles porte la condition, et les case qui suivent définissent une correspondance avec l’objet du test. Dans le cas présent, on test le premier argument de la ligne de commande ($1 voir l’article à ce sujet), une commande echo est exécutée si cette variable contient 1, 2 ou 3.

La directive breaksw permet d’interrompre la condition en cas de vérification de celle-ci, et de poursuivre l’exécution du script après la commande endsw.

Default est un label particulier, il permet de définir une commande par défaut dans la condition.


Tests

Il existe une autre méthode qui permet de tester certaines informations concernant les fichiers, les répertoires, les chaines de caractères, les entiers, etc... La condition d’exécution devant être une commande, les tests s’effectuent par l’intermédiaire de la commande "test expression" qui peut être abrégée par la formule "[ expression ]".

Tests sur les fichiers (et sur les répertoires) :

-  -e fichier : Vrai si le fichier/répertoire existe.
-  -s fichier : Vrai si le fichier à une taille supérieure à 0.
-  -z fichier : Vrai si le fichier fait 0 octet (donc si il est vide).
-  -r fichier : Vrai si le fichier/répertoire est lisible.
-  -w fichier : Vrai si le fichier/répertoire est modifiable.
-  -x fichier : Vrai si le fichier est exécutable ou si le répertoire est accessible.
-  -O fichier : Vrai si le fichier/répertoire appartient à l’utilisateur.
-  -G fichier : Vrai si le fichier/répertoire appartient au groupe de l’utilisateur.
-  -b nom : Vrai si nom représente un périphérique (pseudo-fichier) de type bloc (disques et partitions de disques généralement).
-  -c nom : Vrai si nom représente un périphérique (pseudo-fichier) de type caractère (terminaux, modems et port parallèles par exemple).
-  -d nom : Vrai si nom représente un répertoire.
-  -f nom : Vrai si nom représente un fichier.
-  -L nom : Vrai si nom représente un lien symbolique.
-  -p nom : Vrai si nom représente un tube nommé.
-  fichier1 -nt fichier2 : Vrai si les deux fichiers existent et si fichier1 est plus récent que fichier2.
-  fichier1 -ot fichier2 : Vrai si les deux fichiers existent et si fichier1 est plus ancien que fichier2.
-  fichier1 -ef fichier2 : Vrai si les deux fichiers représentent un seul et même fichier.

Il nous est donc possible de tester la présence d’un certain fichier par exemple :

Voilà une manière bien efficace de réaliser tout un tas de tests sur les fichiers et répertoires.

Tests sur les entiers

Il y a erreur si ce ne sont pas des entiers autour de l’opérateur.

-  entier1 -eq entier2 : Vrai si entier1 est égal à entier2.
-  entier1 -ge entier2 : Vrai si entier1 est supérieur ou égal à entier2.
-  entier1 -gt entier2 : Vrai si entier1 est strictement supérieur à entier2.
-  entier1 -le entier2 : Vrai si entier1 est inférieur ou égal à entier2.
-  entier1 -lt entier2 : Vrai si entier1 est strictement inférieur à entier2.
-  entier1 -ne entier2 : Vrai si entier1 est différent de entier2.

Tests sur les chaînes de caractères

Encadrez la chaîne par des guillemets !

-  -n "chaîne" : Vrai si la chaîne n’est pas vide.
-  -z "chaîne" : Vrai si la chaîne est vide.
-  "chaine1" = "chaine2" : Vrai si les deux chaînes sont identiques.
-  "chaine1" != "chaine2" : Vrai si les deux chaînes sont différentes.

Conclusion

Nous avons abordé les techniques qui permettent d’effectuer des tests, de vérifier des conditions dans nos scripts, elles vont nous permettre de créer l’interactivité avec l’utilisateur de nos programmations, de surveiller des paramètres... Nous emploierons directement ces techniques dans des scripts pratiques les semaines qui suivent :)

 

# !/bin/tcsh

# !/bin/bash

# !/bin/sh

L’opérateur de comparaison &&, représente le ET absolu, et ||, représente le OU absolu.

Envoyer
L'e-mail du destinataire :

Votre Nom :

Votre e-mail :


 |  Imprimer |  Réagir
Copyright 2002-2017 xrings - Tous droits réservés - Mentions légales - Propulsé par SPIP - Webdesigner et référencement Frédéric Guerrier