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.txt
n’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.txt
la 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.