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 message msg, 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 date d ; 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.