Scripts shells : un exemple un peu plus complexe
On souhaite que vous mettiez au point un script log.sh pour
enregistrer et consulter des messages datés : ces messages seront
enregistrés dans le fichier mylog.txt à la racine de votre répertoire
personnel.
Lorsque le script est appelé avec la syntaxe log.sh -a message
(message est une chaîne de caractères), si le fichier $HOME/mylog.txt
n’existe pas alors il est créée, et le message est ajouté à la fin du
fichier. Quand le script est appelé avec la syntaxe log.sh -s date
(date de format JJ/MM/AAAA, par exemple 14/11/2016) :
-
si
$HOME/mylog.txtn’existe pas, il faut dire à l’utilisateur qu’il n’a pas encore enregistré de message ; -
si le fichier existe, il faut : soit afficher tous les messages qui ont été enregistrés à la date indiquée, soit afficher qu’aucun message n’existe à cette date.
Dans la suite, on vous demande de procéder étape par étape, en
travaillant à chaque fois dans un nouveau fichier log-v1.sh,
log-v2.sh, ….
1 - Enregistrement d’un message
En utilisant la page de manuel de date, commencez par repérer (en
testant sur la ligne de commande) comment s’y prendre pour obtenir la
date du jour sous la forme JJ/MM/AAAA. Indication : vous utiliserez une
commande de la forme date +FORMAT, où FORMAT décrit le format que
l’on souhaite obtenir. Trouvez une commande qui permet de placer dans la
variable d la date du jour, sous la forme d’une chaîne de caractères.
Ecrivez ensuite un script log-v1.sh qui prend comme seul argument un
message msg, et :
-
affiche sur sa sortie standard la ligne
Ajout de \"$d::$msg\" dans $HOME/mylog.txt -
ajoute à la fin de
$HOME/mylog.txtla ligne$d::$msg(si le fichier n’existe pas, il est créé).
Voici un exemple d’utilisation d’un script répondant à la question :
nlouvet@nlbook:~$ ./log-v1.sh "Je vais à la piscine"
Ajout de "18/12/2016::Je vais à la piscine" dans /home/nlouvet/mylog.txt
nlouvet@nlbook:~$ ./log-v1.sh "J'ai fait tout mes devoirs :D"
18/12/2016::J'ai fait tout mes devoirs :D
nlouvet@nlbook:~$ cat ~/mylog.txt
18/12/2016::Je vais à la piscine
18/12/2016::J'ai fait tout mes devoirs :D
nlouvet@nlbook:~$
2 - Options du script
Commencez par copier log-v1.sh en log-v2.sh. Dans cette étape, on
vous demande de prendre en compte le fait que le script final va devoir
accepter différentes options (-a ou -s). Modifiez votre script de
façon à ce que :
-
si le script n’est pas appelé avec deux paramètres, alors il affiche un message d’erreur, et termine.
-
si le script est bien appelé avec deux paramètres,
-
si son premier paramètre est
-a, alors il interpréte son deuxième paramètre comme un messagemsg, et il se comporte comme à l’étape précédente. -
si son premier paramètre est
-s, alors il interpréte son deuxième paramètre comme une dated; pour l’instant, le script doit simplement afficher:\Recherche des messages enregistrés à la date $d\Bon alors en fait, je ne sais pas le faire :/ -
sinon, il affiche le message d’erreur et termine.
-
Voici un exemple d’utilisation d’un script répondant à la question :
nlouvet@nlbook:~$ ./log-v2.sh -a "Je vais à la piscine :D"
Ajout de "18/12/2016::Je vais à la piscine :D" dans /home/nlouvet/mylog.txt
nlouvet@nlbook:~$ ./log-v2.sh
erreur : mauvais nombre de paramètres...
usage: ./log-v2.sh [-a message|-b date]
nlouvet@nlbook:~$ ./log-v2.sh -t "Toto fait du vélo !"
erreur : option inconnue...
usage: ./log-v2.sh [-a message|-b date]
nlouvet@nlbook:~$ ./log-v2.sh -a "Il fait froid :("
Ajout de "18/12/2016::Il fait froid :(" dans /home/nlouvet/mylog.txt
nlouvet@nlbook:~$ cat ~/mylog.txt
18/12/2016::Je vais à la piscine :D
18/12/2016::Il fait froid :(
nlouvet@nlbook:~$
3 - La recherche
Dans la version précédente du script, on a laissé de côté la recherche
des messages ayant été entrés à une date donnée (option -s). Il s’agit
maintenant de coder cette partie. Commencez par mettre avec votre
éditeur de texte préféré des messages avec des dates inventées dans
$HOME/mylog.txt. Par exemple :
nlouvet@nlbook:~$ cat ~/mylog.txt
22/06/2016::Il fait très chaud : le 24/06/2016 j'irai à la piscine !
24/06/2016::Je fais du vélo :D
24/06/2016::Je vais à la piscine :D
03/09/2016::Il fait très beau :D
18/12/2016::Il fait trop froid :(
nlouvet@nlbook:~$
Mettez au point une commande grep premettant d’attraper dans le
fichier $HOME/mylog.txt toutes les lignes correspondant à des messages
entrés à une date donnée. Complétez ensuite le script de façon a gérer
l’option -s : si des événements se sont produits à la date passée
comme paramètre après -s, alors ils sont tous affichés, comme dans
l’exemple ci-dessous :
nlouvet@nlbook:~$ ./log-v3.sh -s 25/07/1980
Recherche des messages enregistrés à la date 25/07/1980 :
Fin de la recherche.
nlouvet@nlbook:~$ ./log-v3.sh -s 24/06/2016
Recherche des messages enregistrés à la date 24/06/2016 :
24/06/2016::Je fais du vélo :D
24/06/2016::Je vais à la piscine :D
Fin de la recherche.
nlouvet@nlbook:~$
4 - Vérification du fait que le fichier est non-vide
Modifiez le script précédent, de façon à vérifier que le fichier
$HOME/mylog.txt est bien un fichier régulier existant avant de lancer
une recherche dedans. Si le fichier n’existe pas, vous affichez un
message d’erreur, et quittez :
nlouvet@nlbook:~$ rm -f ~/mylog.txt
nlouvet@nlbook:~$ ./log-v4.sh -s 24/06/2016
erreur : le fichier /home/nlouvet/mylog.txt n'existe pas...
probablement n'avez-vous jamais entré de messages :c
nlouvet@nlbook:~$
5 - Vérification du format de la date
Modifiez le script de façon à vérifier que le format de la date entrée
dans le cas de l’utilisation de l’option -s est bien de la forme
JJ/MM/AAAA. Une façon de procéder est d’utiliser sed pour remplacer
une date valide par la chaîne vide, alors qu’une date non valide sera
remplacée par un chaîne non-vide. Voici un exemple d’exécution :
nlouvet@nlbook:~$ ./log-v5.sh -s 24/6/16
erreur : la date de recherche dois être de la forme JJ/MM/AAAA...
usage: ./log-v4.sh [-a message|-b date]
nlouvet@nlbook:~$ ./log-v5.sh -s 24/06/16
erreur : la date de recherche dois être de la forme JJ/MM/AAAA...
usage: ./log-v4.sh [-a message|-b date]
nlouvet@nlbook:~$ ./log-v5.sh -s 24/06/2016
Recherche des messages enregistrés à la date 24/06/2016 :
24/06/2016::Je fais du vélo :D
24/06/2016::Je vais à la piscine :D
Fin de la recherche.
nlouvet@nlbook:~$
6 - Améliorations cosmétiques
Lors de la recherche :
-
modifiez le script pour qu’il affiche qu’aucun événement n’a été trouvé à la date indiquée si tel est le cas ;
-
produisez un affichage un peu plus joli que l’affichage actuel dans le cas d’une recherche fructueuse ;
-
utilisez des fonctions dans votre script (une pour
-a, l’autre pour-s), pour le rendre plus lisible.