Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 20/09/2012, à 21: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, à 21:58)

Hors ligne

#2 Le 21/09/2012, à 18: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 smile

Hors ligne

#3 Le 21/09/2012, à 18:38

demonipuch

Re : [script] Rappel d'anniversaires

Le problème est simple : le script cherche un fichier anniversaires.txt :

Error: file /home/jeremy/anniversaires.txt not found!

Mais vous avez crée un fichier anniversaire.txt. Il suffit simplement de renommer le fichier.

Hors ligne

#4 Le 21/09/2012, à 19: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 smile

Hors ligne

#5 Le 24/09/2012, à 18:26

cracolinux

Re : [script] Rappel d'anniversaires

Salut Pizz!

Merci pour ce script spécial «Alzheimer» , c'est parfait pour moi!
wink


Pixup : postez vos images vite et bien
« Ne devenez jamais pessimiste. Un pessimiste a plus souvent raison qu'un optimiste, mais l'optimiste s'amuse plus — et aucun des deux ne peut arrêter la marche du monde. » R.Heinlein

Hors ligne

#6 Le 26/09/2012, à 09: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, à 22: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

Haut de page ↑