Année universitaire 2002-2003 |
|
Licence d'informatique
Module 4 - partie "C / shell"
Travaux pratiques 9 :
Exercice 1 : appel dans un script d'une commande C.
Exercice 2 : renversement d'un fichier.
Exercice 3 : taille d'un répertoire.
|
1. Exercice 1.
1) Écrire la commande division, en
langage C, permettant de calculer le quotient et le reste de la division entière de deux
valeurs passées en paramètres.
Exemple :
$ division 15 4
quotient : 3 - reste : 3
$
|
- Pour récupérer ces valeurs, on utilisera les paramètres
du programme principal, déjà présentés lors
de la séance 6 de travaux pratiques :
On renverra le code de retour 2 si le nombre
de paramètres est incorrect, le code de retour 1 si
le deuxième paramètre est nul (cas d'une division par 0)
et le code de retour 0 sinon.
- Pour convertir argv[1] et argv[2]
(qui sont des chaînes de caractères) en entiers, on pourra
utiliser la fonction atoi ("alphanuméric
to integer") de la "librairie standard" stdlib.h,
dont l'en-tête est :
Le mot-clé const indique que, dans
la fonction atoi, la valeur de s
ne doit absolument pas être modifiée (on parle de "type
contraint"). Cette fonction peut être appelée de la façon
suivante :
2) Écrire le script appel.sh qui, après
avoir lu deux valeurs entières au clavier, appelle la commande division,
en lui passant ces deux valeurs en paramètres. Le script affichera
un message d'erreur si la commande division renvoie
un code de retour strictement positif.
2. Exercice 2.
On se propose d'écrire un script inverse.sh,
qui réécrit un fichier en inversant l'ordre de ses lignes.
Ce script reçoit en paramètre le nom du fichier à
inverser. Ce paramètre peut être éventuellement suivi
du nom d'un autre fichier. Dans ce cas, l'inversion du fichier initial
sera effectuée dans le second fichier (le fichier initial n'étant
pas modifié). On pourra suivre, étape par étape, les
indications suivantes pour parvenir à l'écriture finale du
script :
- Écrire le script inverse.sh qui teste si
le nombre de ses paramètres est bien égal à 1
ou à 2. Dans le cas contraire, on affichera
le message suivant :
Produire un code de retour en rapport avec un appel correct ou erroné
de la commande.
- Si le nombre de paramètres est égal à 2,
recopier le fichier correspondant au premier paramètre dans le second
et relancer le script inverse.sh, avec seulement
le second paramètre en paramètre (appel récursif).
Afin de tester le bon fonctionnement du script, on affichera le message
Un seul paramètre, dans le cas où
le script n'est lancé qu'avec un seul paramètre. Dans le
cas d'un appel avec deux paramètres, ce message ne devra apparaître
qu'une fois (après l'appel récursif).
- Dans le cas où il n'y a qu'un seul nom de fichier en paramètre,
récupérer dans la variable nblignes
le nombre de lignes de ce fichier. Tester le script, en affichant la valeur
de nblignes.
- Mettre en place la boucle while qui permettra
de parcourir le fichier ligne par ligne. Pour la tester, on affichera la
valeur décrémentée de nblignes
à chaque parcours de boucle.
- À chaque parcours de boucle, envoyer les nblignes
premières lignes du fichier passé en paramètre dans
le fichier temporaire .inv1 (on conseille d'utiliser
la commande head -n $nblignes, dans laquelle
l'argument qui suit l'option -n désigne
le nombre de lignes à extraire du fichier), puis concaténer
la dernière ligne du fichier .inv1 à .inv2.
Vérifier, en consultant le contenu de .inv2
après exécution du script. Contrôler qu'il ne manque
pas de lignes (ni la première ni la dernière).
Effacer .inv2 après chaque test.
- Recopier .inv2 dans le fichier passé
en paramètre. Effacer les fichiers .inv1
et .inv2
Tester le script avec un, puis deux fichiers passés en paramètres.
3. Exercice 3.
On souhaite écrire une commande similaire à une commande
UNIX, de nom t_rep, dont le rôle est de donner
diverses indications sur le contenu d'un répertoire. Appelée
sans paramètre, cette commande doit renvoyer la taille cumulée
des fichiers que contient le répertoire courant. Appelée
avec l'option -r, elle doit indiquer le nombre de
sous-répertoires contenus dans le répertoire courant. Appelée
avec l'option -f, elle doit renvoyer le nombre de
fichiers contenus dans le répertoire courant. Appelée avec
un nom de répertoire en paramètre (après les éventuelles
options), les valeurs retournées concernent le contenu de ce répertoire.
On supposera que cette commande ne peut être appelée qu'avec
au plus une seule option (soit -f, soit -r).
On pourra suivre, étape par étape, les indications suivantes
pour réaliser le script (on prendra soin de tester le bon fonctionnement
du script après chacune de ces étapes) :
1) Initialisation :
- Tester si le nombre de paramètres est compris entre 0
et 2. Dans le cas contraire, afficher le message
suivante :
Produire un code de retour en rapport avec un appel correct ou erroné
de la commande.
- Initialiser la variable repertoire à
la valeur . (répertoire courant). Initialiser
deux variables fich et rep
à 0. S'il y a au moins un paramètre et si le premier paramètre
commence par un caractère - (on utilisera
la commande cut avec l'option -c),
afficher le message :
- Si le premier paramètre commence par un caractère
-, identifier les options demandées en affectant
la variable fich (respectivement rep)
à 1 si l'option -f
(respectivement -r) est active et en la laissant
à 0 si ce n'est pas le cas. Vérifier,
en affichant les variables fich et rep
lors de différents appels au script.
- Si la présence d'une option est détectée, et
si cette option n'est ni -f ni -r,
afficher un message d'erreur.
- Si la présence d'une option est détectée, et
s'il y a deux paramètres, initialiser la variable repertoire
à la valeur du deuxième paramètre.
- S'il n'y a qu'un seul paramètre (et s'il n'y a pas d'option),
affecter la valeur de ce paramètre à la variable repertoire.
- S'il y a deux paramètres, et s'il n'y a pas d'option, afficher
un message d'erreur.
2) Traitement :
- Initialiser nbr (variable qui désigne
le nombre de répertoires) à 0
- Parcourir la liste du contenu du répertoire repertoire
- Si un élément v de la liste
est un répertoire (on pourra effectuer ce test à l'aide de
la commande test -d v qui renvoie un code de retour
nul si v est un répertoire, et un code de
retour positif sinon), incrémenter nbr
- Afficher nbr et sortir avec un code de retour
nul.
- Procéder de même avec les fichiers, si fich
vaut 1 (on testera si un des éléments
de la liste du contenu de répertoire est un fichier, à l'aide
de la commande test -f v)
- Si ni rep ni fich ne valent 1, la commande doit afficher la somme des tailles
des fichiers (on utilisera à nouveau la commande test
-f v) contenus dans repertoire. Pour cela, produire la liste détaillée des informations concernant le contenu de repertoire. Dans une boucle
while, récupérer l'information de
la taille du fichier et faire la somme dans la variable total. Une fois calculée cette somme, afficher sa valeur.
Ces pages ont été réalisées
par A. Crouzil, J.D. Durou et Ph. Joly.
Pour tout commentaire, envoyer un mail à
crouzil@irit.fr, à durou@irit.fr ou à Philippe.Joly@irit.fr.