Bonjour,
je viens de retrouver un script que j’avais écrit il y a quelques temps pour déterminer lesquels de mes anniversaires tomberaient pendant des jours ouvrés sur les X prochaines années, afin d’envoyer automatiquement (facultativement) une demande de congés pour ces dates.
C’était plus pour faire rire les collègues, mais je le partage ici, on ne sait jamais (j’ai hésité avec la section Pause Café):
#!/bin/bash
# $0 -d AAAA -f AAAA -m manager@domain.com mm/DD
# utilise getopt, date, mail (paquet mailutils)
RETCODE=0
function printhelp {
echo -e "\tANNIV-CHECK\tVérifier quels jours de la semaine tomberont ses prochaines dates anniversaires"
echo -e "Usage:\t$(basename $0) [OPTIONS] <date anniversaire (format jj/mm)>"
echo "OPTIONS:"
echo -e "-d année\tAnnée de début de vérification, au format aaaa (par défaut: année courante)"
echo -e "-f année\tAnnée de fin de la vérification, au format aaaa (par défaut: année de début + 10 ans)"
echo -e "-m email\tAdresse email de la personne à qui envoyer par mail une demande de congés (nécessite /usr/bin/mail avec configuration d'un serveur SMTP)"
echo -e "-h\t\tAffiche cette aide et quitte le programme."
echo -e "\nExemples:\n$(basename $0) -d 2019 28/10\nVérifier les jours anniversaires du 28 Octobre entre 2019 et 2029\n$(basename $0) -m manager@travail.com 14/02\nVérifier les jours anniversaires du 14 février pour les 10 prochaines années, et envoyer un mail de demande de congés pour toutes les dates en semaine à manager@travail.com"
exit $RETCODE
}
# Vérification des binaires
verif="true"
for binaire in getopt date ; do
which $binaire > /dev/null
if [ $? -ne 0 ] ; then verif="false" ; echo "Le binaire $binaire n'a pas été trouvé." ; fi
done
if [ "$verif" = "false" ] ; then echo "Sortie." ; exit 1 ; fi
if [ $# -lt 1 ] ; then RETCODE=1 ; printhelp ; fi
# Valeurs par défaut des paramètres
debut=$(date +%Y)
fin=$(date -d "$debut +10 years" +%Y)
mail=""
text="Bonjour,\n\nje souhaite poser commes congés les dates suivantes:\n"
# Evaluation des paramètres
TEMP=$(getopt -o d:f:m:h -n error -- "$@")
if [ $? -ne 0 ] ; then echo "Erreur getopt" >&2 ; exit 1 ; fi
eval set -- "$TEMP"
unset TEMP
while true ; do
case $1 in
-d) debut="$2" ; shift 2 ;;
-f) fin="$2" ; shift 2 ;;
-m) mail="$2" ; shift 2 ;;
-h) RETCODE=0 ; printhelp ; shift ;;
--) shift ; break ;;
*) echo -e "Option non reconnue: $1\n" ; RETCODE=1 ; printhelp ;;
esac
done
anniv="$1"
anniv2=$(echo $anniv | awk -F"/" '{print $2"/"$1}')
# Traitement principal
for ((year=$debut;year<=$fin;year++)) ; do
echo -en "$year\t" ;
jour=$(date -d "${anniv2}/${year}" +%A)
echo "Le $anniv est un $jour"
case $jour in
lundi|mardi|mercredi|jeudi|vendredi ) text="$text\n$jour $anniv $year" ;;
* ) ;;
esac
done
# Envoi de mail (facultatif)
if [ -n "$mail" ] ; then
text="$text\n\nMerci !"
echo -e "\nLe texte suivant sera envoyé par email à l'adresse $mail :\n"
echo -e "$text\n\n"
read -p "Valider ? (O/N) " answer
case ${answer^^} in
O) echo "Envoi..." ; echo -e "$text" | mail -s 'Demande de congés futurs' "$mail" && echo "OK" ;;
N) echo "Abandon de l'envoi du mail." ;;
*) echo "Réponse non comprise (répondre O ou N)" ; exit 1 ;;
esac
fi
J’aurais pu ajouter une vérification de validité de l’argument (vérifier s’il s’agit bien d’une date valide au format jj/mm), et une coloration de la sortie (lundi -> vendredi: en rouge, samedi - dimanche en vert) mais bon, vu l’utilité
Exemple d’utilisation:
Sputnik@debian:~$ ./anniv-check.sh -m ressources_humaines@cogip2000.com 19/02
2020 Le 19/02 est un mercredi
2021 Le 19/02 est un vendredi
2022 Le 19/02 est un samedi
2023 Le 19/02 est un dimanche
2024 Le 19/02 est un lundi
2025 Le 19/02 est un mercredi
2026 Le 19/02 est un jeudi
2027 Le 19/02 est un vendredi
2028 Le 19/02 est un samedi
2029 Le 19/02 est un lundi
2030 Le 19/02 est un mardi
Le texte suivant sera envoyé par email à l'adresse ressources_humaines@cogip2000.com :
Bonjour,
je souhaite poser commes congés les dates suivantes:
mercredi 19/02 2020
vendredi 19/02 2021
lundi 19/02 2024
mercredi 19/02 2025
jeudi 19/02 2026
vendredi 19/02 2027
lundi 19/02 2029
mardi 19/02 2030
Merci !
Valider ? (O/N) O
Envoi...
OK