Pages : 1
#1 Le 20/09/2012, à 20:11
- Pizz
[script] Rappel d'anniversaires
Salut,
Voilà un petit script "anniversaire.sh" qui permet d'afficher les anniversaires du jour, du jour d'après ou du jour d'avant (pour se rattraper) dans une fenêtre zenity.
Pour cela, il faut remplir un fichier anniversaires.txt de la forme :
#jj-mm-aaaa nom
06-01-1983 Nicolas
26-01-1985 Julien
14-02-1984 Jeremy
17-02-1900 Marie
Par défaut, le script cherche le fichier ~/anniversaires.txt, mais on peut spécifier le fichier avec l'option -f.
Chez moi, j'ai mis ce script dans les applications au démarrage, et dans mon .zshrc (ou .bashrc) avec l'option -c (ligne de commande seule).
Je ne suis pas un spécialiste du bash, toutes vos remarques sur l'amélioration du code me seront utiles.
Voici le script :
#!/bin/bash
# Anniversire.sh
#
# Affiche l'anniversaire du jour à partir du fichier ~/anniversaires.txt
#
#
# Exemple de fichier anniversaires.txt :
# #jour-mois-année Nom
# 06-01-1983 Nicolas
# 26-01-1985 Julien
# 14-02-1984 Jeremy
# 17-02-1980 Marie
#
usage()
{
cat << EOF
$0
Script pour rappel d'anniversaires.
Affiche dans une fenêtre Zenity les anniversaires du jour,
du jour d'avant et du jour d'après contenus dans un fichier
"anniversaires.txt", de la forme :
#jj-mm-aaaa nom
06-01-1983 Nicolas
26-01-1985 Julien
14-02-1984 Jeremy
17-02-1900 Marie
OPTIONS :
-f spécifie le fichier anniversaire.txt, par défaut : ~/anniversaires.txt
-c n'affiche le résultat que dans la console
-h affiche cette aide
EOF
}
verif()
{
DATE=$(date --date=$1 +%d-%m)
if [[ $DATE == $DateAnniv ]]
then
JOUR=$2
AGE=$(( $(date +%Y) - $AnneeNaissance ))
TEXTE=$( printf "%-11s %-5s : anniversaire de %-10s : %2s ans\n" $JOUR $DATE $Nom $AGE )
echo "$TEXTE"
if ! $COMMANDLINE
then
zenity --info --text "$TEXTE"
fi
fi
}
FILE=~/anniversaires.txt
COMMANDLINE=false
# Parsing arguments
while getopts "hcf:" OPTION
do
case $OPTION in
h)
usage
exit 0
;;
f)
FILE=$OPTARG
;;
c)
COMMANDLINE=true
;;
?)
echo "options possibles : -h, -c, -f"
exit 0
;;
esac
done
# test if FILE exists
if [ -e $FILE ]
then
#=================================#
while read LINE
do
if [[ ${LINE:0:1} != "#" ]] # ligne de commentaire : commence par #
then
DateAnniv=${LINE:0:5}
AnneeNaissance=${LINE:6:4}
Nom=${LINE:10}
verif "today" "Aujourd'hui"
verif "tomorrow" "Demain"
verif "yesterday" "Hier"
fi
done < $FILE
else
echo "Error: file $FILE not found!" >&2
exit
fi
EDIT : amélioration de pingouinux
Dernière modification par Pizz (Le 29/09/2012, à 20:58)
Hors ligne
#2 Le 21/09/2012, à 17:31
- jeremlens
Re : [script] Rappel d'anniversaires
Salut, petit script qui a l'air bien sympa.
Cependant j'ai un petit pb :
jeremy@jeremy-HP:~$ ./anniversaire.sh
Error: file /home/jeremy/anniversaires.txt not found!
Pourtant j'ai bien les fichiers dans mon /home
jeremy@jeremy-HP:~$ ls
anniversaire.sh Bureau Images Modèles Public Vidéos
anniversaire.txt Documents KMail2.desktop Musique Téléchargements
Voici les deux fichiers :
jeremy@jeremy-HP:~$ cat anniversaire.txt
#jj-mm-aaaa nom
28-01-1992 Jérémy
31-08-1992 Charlotte
20-09-1995 Ludivine
15-09-1994 Tifany
06-09-1975 Rolande
21-09-2011 Test
jeremy@jeremy-HP:~$
anniversaire.sh
jeremy@jeremy-HP:~$ cat anniversaire.sh
#!/bin/bash
# Anniversire.sh
#
# Affiche l'anniversaire du jour à partir du fichier ~/anniversaires.txt
#
#
# Exemple de fichier anniversaires.txt :
# #jour-mois-année Nom
# 06-01-1983 Nicolas
# 26-01-1985 Julien
# 14-02-1984 Jeremy
# 17-02-1980 Marie
#
usage()
{
cat << EOF
$0
Script pour rappel d'anniversaires.
Affiche dans une fenêtre Zenity les anniversaires du jour,
du jour d'avant et du jour d'après contenus dans un fichier
"anniversaires.txt", de la forme :
#jj-mm-aaaa nom
06-01-1983 Nicolas
26-01-1985 Julien
14-02-1984 Jeremy
17-02-1900 Marie
OPTIONS :
-f spécifie le fichier anniversaire.txt, par défaut : ~/anniversaires.txt
-c n'affiche le résultat que dans la console
-h affiche cette aide
EOF
}
FILE=~/anniversaires.txt
COMMANDLINE=false
# Parsing arguments
while getopts "hcf:" OPTION
do
case $OPTION in
h)
usage
exit 0
;;
f)
FILE=$OPTARG
;;
c)
COMMANDLINE=true
;;
?)
echo "options possibles : -h, -c, -f"
exit 0
;;
esac
done
# test if FILE exists
if [ -e $FILE ]
then
yesterday=$(date --date="yesterday" +%d-%m)
today=$(date +%d-%m)
tomorrow=$(date --date="tomorrow" +%d-%m)
#=================================#
while read LINE
do
if [[ ${LINE:0:1} != "#" ]] # ligne de commentaire : commence par #
then
DateAnniv=${LINE:0:5}
AnneeNaissance=${LINE:6:4}
Nom=${LINE:10}
if [[ $today == $DateAnniv ]] # Aujourd'hui
then
echo "Aujourd'hui $today : anniversaire de $Nom : $(( $(date +%Y) - $AnneeNaissance )) ans"
if ! $COMMANDLINE
then
zenity --info --text "Aujourd'hui, anniversaire de $Nom : $(( $(date +%Y) - $AnneeNaissance )) ans"
fi
fi
if [[ $tomorrow == $DateAnniv ]] # Demain
then
echo "Demain $tomorrow : anniversaire de $Nom : $(( $(date +%Y) - $AnneeNaissance )) ans"
if ! $COMMANDLINE
then
zenity --info --text "Demain $tomorrow, anniversaire de $Nom : $(( $(date +%Y) - $AnneeNaissance )) ans"
fi
fi
if [[ $yesterday == $DateAnniv ]] # Hier
then
echo "Hier $yesterday : anniversaire de $Nom : $(( $(date +%Y) - $AnneeNaissance )) ans"
if ! $COMMANDLINE
then
zenity --info --text "Hier $yesterday, anniversaire de $Nom : $(( $(date +%Y) - $AnneeNaissance )) ans"
fi
fi
fi
done < $FILE
else
echo "Error: file $FILE not found!" >&2
exit
fi
Merci
Hors ligne
#4 Le 21/09/2012, à 18:57
- jeremlens
Re : [script] Rappel d'anniversaires
Ouh punaise, je cherche depuis tout à l'heure pour rien.. ^^
Peut-être si tu sais faire : améliorer le script en affichant une notif permanente sur le bureau (à la manière d'un composant graphique sous kde)
Merci beaucoup sinon
Hors ligne
#5 Le 24/09/2012, à 17:26
- cracolinux
Re : [script] Rappel d'anniversaires
Salut Pizz!
Merci pour ce script spécial «Alzheimer» , c'est parfait pour moi!
Hors ligne
#6 Le 26/09/2012, à 08:06
- pingouinux
Re : [script] Rappel d'anniversaires
Bonjour Pizz,
Pour info, dans ton script du #1, tu peux utiliser une fonction pour éviter les séquences répétitives. Voici la fin de ton script qui utilise une fonction verif :
verif() {
DATE=$(date --date=$1 +%d-%m)
if [[ $DATE == $DateAnniv ]]
then
JOUR=$2
AGE=$(( $(date +%Y) - $AnneeNaissance ))
TEXTE=$( printf "%-11s %-5s : anniversaire de %-10s : %2s ans\n" $JOUR $DATE $Nom $AGE )
echo "$TEXTE"
if ! $COMMANDLINE
then
zenity --info --text "$TEXTE"
fi
fi
}
# test if FILE exists
if [ -e $FILE ]
then
#=================================#
while read LINE
do
if [[ ${LINE:0:1} != "#" ]] # ligne de commentaire : commence par #
then
DateAnniv=${LINE:0:5}
AnneeNaissance=${LINE:6:4}
Nom=${LINE:10}
verif "today" "Aujourd'hui"
verif "tomorrow" "Demain"
verif "yesterday" "Hier"
fi
done < $FILE
else
echo "Error: file $FILE not found!" >&2
exit
fi
Hors ligne
#7 Le 29/09/2012, à 21:00
- Pizz
Re : [script] Rappel d'anniversaires
Bonjour pingouinux,
Merci pour cette amélioration, c'est effectivement plus malin comme ça !
J'ai modifié de script en conséquence.
Hors ligne