Générer une date aléatoire en Bash

Publié le 17 décembre 2009 par Lb01

Nous allons voir ici comment générer une date aléatoire en Bash, en pennant en compte le dernier jour du mois qui peut être variable.

Cet article est en fait l'application pratique des articles " Générer un nombre aléatoire compris entre deux valeurs en Bash" et " Trouver le dernier jour d'un mois en bash !".

Calcul du mois et de l'année

Commençons par le plus facile, l'année et le mois. Il suffit de reprendre la formule présentée dans un précédant article et d'y modifier les valeurs minimales et maximales :

yearMin=1950
    yearMax=2012
    year=$[($RANDOM % ($[$yearMax - $yearMin] + 1)) + $yearMin]
    month=$[($RANDOM % ($[12 - 1] + 1)) + 1]

Et pour le jour alors ?

C'est déjà un peu plus compliqué, il faut connaître le dernier jour du mois (pour le max de notre formule) et il peut-être le 31, le 30, le 29 ou même le 28 !

Heureusement que, étant des lecteurs assidus, vous avez lu le dernier article intitulé " Trouver le dernier jour d'un mois en bash !".

Il nous suffit donc de reprendre la formule présentée dans cet article et de l'adapter à notre code (tiens, c'est drôle, les variables correspondent déjà :-) ) :

lastMonthDay=$(date -d "$year-$month-01 +1 month -1 day" +%d)

Il ne nous reste plus qu'à générer notre jour aléatoire :

day=$[($RANDOM % ($[$lastMonthDay - 1] + 1)) + 1]

Vous pouvez ensuite afficher votre date comme bon vous semble :

echo "$day/$month/$year"

Code final

Ce qui nous donne au final :

yearMin=1950
    yearMax=2012
    year=$[($RANDOM % ($[$yearMax - $yearMin] + 1)) + $yearMin]
    month=$[($RANDOM % ($[12 - 1] + 1)) + 1]
    lastMonthDay=$(date -d "$year-$month-01 +1 month -1 day" +%d)
    day=$[($RANDOM % ($[$lastMonthDay - 1] + 1)) + 1]
    echo "$day/$month/$year"