Forum Linux.général Gestion des années bissextiles en shell (bash)

Posté par  .
Étiquettes : aucune
0
22
nov.
2005
Bonjour à tous,

Voilà, je cherche à gérer les années bissextiles dans un shell, le "cahier des charges" est le suivant:

- Les années divisibles par 4 sont bissextiles, pas les autres.
- Exception: les années divisibles par 100 ne sont pas bissextiles.
- Exception à l'exception: les années divisibles par 400 sont
bissextiles.

Pour le moment, j'ai écrit un truc du genre:

if [ $(($ANNEE % 4)) -eq 0 -a $(($ANNEE % 100)) -ne 0 -a $(($ANNEE % 400)) -eq 0 ] then
echo $ANNEE est bissextile
else
echo $ANNEE non bissextile
fi

En gros ça dit, si le modulo de $ANNEE / 4 est nul, que le modulo de $ANNEE / 100 n'est pas nul et que le modulo de $ANNEE / 400 est nul, alors une année est considérée comme bissextile.

Mais comme bash ne connaît que les entiers, je me demande si les modulo que je récupère à l'aide de l'opérateur % est bien valide ou pas, je m'explique:

Prenons pour exemple, l'année 2008, elle est bien bissextile car d'après mon calendrier il y a bien un 29 février:

echo $((2008 % 4)) ----> Modulo 0 donc divisible par 4 (clause 1 respectée)
echo $((2008 % 100)) ----> Modulo 8 donc non divisible par 100 (clause 2 respectée)
echo $((2008 % 400)) ----> Modulo 8 donc à priori pas divisible par 400, pourtant cette année est bissextile, mais il ne s'agit bien sûr que de l'exception à l'exception.

Dois-je me baser uniquement sur la divisibilité par 4 et de la non-divisibilité par 100 pour dire qu'une année est bissextile ou non ?

D'après certaines moules dont je tairai le nom, la prochaine "exception" ne sera qu'en 2100, mon code ne sera plus en prod c'est certain ;-)
  • # cal

    Posté par  . Évalué à 1.

    cal 2 $ANNEE | grep 29 > /dev/null && echo bissextile

    ou bien

    cal 2 $ANNEE | grep 29 > /dev/null || echo pas bissextile
    • [^] # Fonctionne pas ;)

      Posté par  (site web personnel) . Évalué à 1.

      $ cal 2 2028 | grep 29 > /dev/null && echo bissextile || echo pas bissextile
      bissextile
      $ cal 2 2029 | grep 29 > /dev/null && echo bissextile || echo pas bissextile
      bissextile



      Avec tail.
      $ isBissextil() { cal 2 $1 | tail -2 | grep 29 > /dev/null && echo "Bissextille" || echo "Non bissextile" }

      Autres variantes :
      $ isBissextil() { cal 2 $1 | grep -v $1 | grep 29 > /dev/null && echo "Bissextille" || echo "Non bissextile" }
      $ isBissextil() { cal 2 $1 | grep -v "Février" | grep 29 > /dev/null && echo "Bissextille" || echo "Non bissextile" } (si c'est en français)


      (Oui, c'est honteusement pompé sur Infernal Quak ;) )
  • # one line

    Posté par  (site web personnel) . Évalué à 3.

    $ isBissextil() { cal 2 $1 | grep 29 > /dev/null && echo "Bissextille" || echo "Non bissextile"; }

    $ isBissextil 2005
    Non bissextille

    $ isBissextil 2004
    Bissextille

    L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

    • [^] # Re: one line

      Posté par  (site web personnel) . Évalué à 2.

      Oui je sais, grillai.

      Pas besoin de me moinsser bande de racailles ! :)

      L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

  • # un poil de logique

    Posté par  (site web personnel) . Évalué à 3.

    bissextile = [divisible par 4] et ([non divisible par 100] ou [divisible par 400])

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.