Ceci est une astuce plus qu’un article mais elle peut être utile dans le cadre d’un shell script.

On va utiliser le binaire « cal » qui, lorsqu’on l’utilise tout seul, génère dans un terminal un calendrier du mois courant:

$ cal
       février 2011
dim lun mar mer jeu ven sam
         1   2   3   4   5
 6   7   8   9  10  11  12
13  14  15  16  17  18  19
20  21  22  23  24  25  26
27  28

Une fois que l’on a le calendrier il nous suffit de l’exploiter en commençant par retirer les caractères alphabétiques:

$ cal | grep -v '[a-zA-Z]'
         1   2   3   4   5
 6   7   8   9  10  11  12
13  14  15  16  17  18  19
20  21  22  23  24  25  26
27  28

L’étape suivante consiste maintenant à compter le nombre de mots:

$ cal | grep -v '[a-zA-Z]' | wc -w
      28

Maintenant, si vous souhaitez rendre exploitable cette valeur dans un script il suffit de définir une variable de type entier (integer) dans laquelle vous stockez le résultat de la commande:

$ typeset -i NB_DAYS=$(cal | grep -v '[a-zA-Z]' | wc -w)
$ echo ${NB_DAYS}
28

Nous venons de voir comment faire pour le mois courant maintenant pour un mois spécifique il suffit de spécifier quel mois on désire (en numérique) et quelle année:

$ typeset -i NB_DAYS=$(cal 6 2011| grep -v '[a-zA-Z]' | wc -w)
$ echo ${NB_DAYS}
30

ou

$ typeset -i NB_DAYS=$(cal 6 $(date +%Y) | grep -v '[a-zA-Z]' | wc -w)
$ echo ${NB_DAYS}
30

Si vous souhaitez pousser un peu plus le vice on peut imaginer travailler avec une fonction dans un script se nommant « test.sh »:

#!/usr/bin/sh
function day_in_month {
        if [[ -n ${1} && -n ${2} ]] ; then
                month=${1}
                year=${2}
        else
                eval $(date "+month=%m year=%Y")
        fi
 
        echo $(cal ${month} ${year} | grep -v '[a-zA-Z]' | wc -w)
}
 
 
echo "Mois?"
read check_month
echo "Annee?"
read check_year
 
day_in_month ${check_month} ${check_year}
 
exit 0

Si on l’execute:

$ ./test.sh
Mois?
2
Annee?
2012
Le mois 2/2012 compte 29 jours.

Petite astuce en suivant: Comment récupérer le dernier Samedi du mois:

$ cal 02 2012 | awk '{ print $6 }' | grep -v '^$' | tail -1
25

ou

$ cal 02 2012 | awk '{ print $6 }' | grep -v '^$' | sed '$!d'
25

ou encore

$ cal 02 2012 | awk '{ print $6 }' | awk 'NF{ s=$0 } END { print s }'
25

En espérant que cette petite astuce pourra vous aider.