un petit (gros) shell script bien utile

C'est ici que sont postés les messages qui n'entrent pas dans le cadre des autres forums.
Ces messages doivent néanmoins rester en conformité avec la <a href=http://www.ixus.net/charte_forums.php>Charte</a> qui régule les forums.
Nous vous remercions d'éviter les sujets complètement off-topic (foot, pêche ...). Ne perdons pas de vue qu'Ixus reste un site relatif à l'informatique.

Modérateur: modos Ixus

un petit (gros) shell script bien utile

Messagepar yahnice » 24 Fév 2005 11:48

Bonjour.

Il y a quelque temps j'ai eu besoin de manipuler des dates : d'enlever ou ajouter des jours , des mois, des années à une date donnée, et je me suis amusé à faire ça en shell parce que mon C est vraiment vraiment rouillé et je n'en fais jamais :wink:

Mon script est débuggé et il fonctionne, je m'en sers tous les jours dans mes programmes de sauvegarde etc.
Mais je l'ai fait il y a bien 2 ans et depuis mes connaissances en shell se sont améliorées mais je n'ai pas le temps de le reprendre pour le modifier et le rendre plus performant et aussi plus simple alors qu'il y a moyen et même surement besoin :roll:

Donc si quelques uns sont interressés pour voir-corriger-améliorer le programme, je posterai le code.

Voilà, j'attends vos commentaires
Avatar de l’utilisateur
yahnice
Quartier Maître
Quartier Maître
 
Messages: 23
Inscrit le: 03 Fév 2005 16:38

Messagepar tomtom » 24 Fév 2005 12:01

ben oui faut le poster ;)

Personnellement j'utilsais des programme en c pour ce genre de choses que j'appelais à partir des scripts.

Les grosses difficultés sont "comment compter j+1, j+2, j+n" en tenant compte des années bissextile etc ;)

Savoureux !

t.
One hundred thousand lemmings can't be wrong...
Avatar de l’utilisateur
tomtom
Amiral
Amiral
 
Messages: 6035
Inscrit le: 26 Avr 2002 00:00
Localisation: Paris

Messagepar yahnice » 24 Fév 2005 12:20

ok alors voilà le script et effectivement c'est la galère pour compter avec les années bisextiles, les mois de 30 ou 31 jours ... :shock:

Mias je me suis bien amusé :P

Code: Tout sélectionner

#!/bin/sh
#
#
# DERNIERE MODIF 03.05.2004
#
# odate : calcul d'une date depuis une autre date avec n importe quel delai

#------------------------------------------------------
# test des paramètres passés en ligne de commande
#------------------------------------------------------
P1()
{

fin=0
p3=0
[ $# -gt 0 ] && \
{
  case $2 in                                                                 
      plus)  [ $# -eq "4" ] && p3=1 || P2;;
      moins) [ $# -eq "4" ] && p3=1 || P2;;
      +)     [ $# -eq "4" ] && p3=1 || P2;;
      -)     [ $# -eq "4" ] && p3=1 || P2;;   
      *) ERR 4 $2;;
         
   esac
   case $4 in
        an)     type=annee;;
        AN)     type=annee;;
        annee)  type=annee;;
        ANNEE)  type=annee;;
        ANS)    type=annee;;
        ans)    type=annee;;
        annees) type=annee;;
        ANNEES) type=annee;;
        mois)   type=mois;;
        moi)    type=mois;;
        MOIS)   type=mois;;
        MOI)    type=mois;;
        jour)   type=jour;;
        jours)  type=jour;;
        JOUR)   type=jour;;
        JOURS)  type=jour;;
        a)      type=annee;;
        A)      type=annee;;
        m)      type=mois;;
        M)      type=mois;;
        j)      type=jour;;
        J)      type=jour;;
        *)      ERR 6 $4;;
     esac

   
} || \
{
P2
fin=1
}
}
#---------------------------------
#  manuel()
#---------------------------------
P2()
{
if [ $silence -eq 0 ]
then
        echo ""
        echo "Syntaxe : \"odate [date_donnee] [fonction] [delai] [type] [s ou rien]\""
        echo "[date_donne] = jj.mm.aaaa"
        echo "[fonction]   = plus/moins +/-"
        echo "[delai]      = un nombre"
        echo "[type]       = type du delai en jour ou mois ou annee"
        echo "[s]          = mode silence : messages remplaces par codes d'erreur"
        echo "Exemple :"
        echo "            odate 21.03.2003 moins 1 mois  =    21.02.2003"
        echo "            odate 21.03.2003 + 12 jour  =    02.04.2003"
        echo ""
        echo "Liste des codes d'erreur pour le mode s(ilence):"
        echo "1 : le mois n'est pas dans la fourchette 01-12"
        echo "2 : le jour n'est pas dans la fourchette 01-31"
        echo "3 : le format de date n'est pas reconnu jj.mm.aaaa ou jj/mm/aaaa"
        echo "4 : l'operateur n'est pas reconnu (+-)"
        echo ""
fi       
exit     
}

#-----------------------------------
#  calcul()
#-----------------------------------
P3()
{
testsepar=`expr 1`
if [ `echo $1 | grep "\."` ]
then
     joura=`echo $1 | awk -F "." '{print $1}'`
     moisa=`echo $1 | awk -F "." '{print $2}'`
     ana=`echo $1 | awk -F "." '{print $3}'`
     separ=.
     testsepar=`expr $testsepar + 1`
fi
if [ `echo $1 | grep "\/"` ]
then
     joura=`echo $1 | awk -F "/" '{print $1}'`
     moisa=`echo $1 | awk -F "/" '{print $2}'`
     ana=`echo $1 | awk -F "/" '{print $3}'`
     separ=/
     testsepar=`expr $testsepar + 1`
fi

[ $testsepar -eq 3 ] && ERR 7
     
case $2 in
  plus) fct=+ ;;
  moins) fct=-  ;;
  +)    fct=+;;
  -)    fct=-;;
esac
delai=$3

[ $joura -lt 0 -o $joura -gt 31 ] && ERR 2
[ $moisa -lt 0 -o $moisa -gt 12 ] && ERR 1


case $type in
  annee) an=`expr $ana $fct $delai`
         mois=$moisa
         jourf=$joura
         [ `expr $an % 4` -ne 0 -a $mois -eq 2 -a $jourf -gt 28 ] && jourf=28
         [ `expr $an % 4` -eq 4 -a $mois -eq 2 -a $jourf -gt 29 ] && jourf=29;;
 
  mois) diffmois=`expr $moisa $fct $delai`
         
         moisan=0
         if [ $diffmois -le 0 ]
         then
                 moisan=`expr \( $diffmois / 12 \) + 1`
         fi
         if [ $diffmois -gt 12 ]
         then
                 moisan=`expr $diffmois / 12`
         fi
         [ $diffmois -eq 0 ] && diffmois=`expr 11 + 1`

         an=`expr $ana $fct $moisan`
         
         mois=`expr $moisa $fct \`expr $delai % 12\``
         mois=`expr $mois % 12`
         [ $mois -le 0 ] && mois=`expr $mois + 12`
    jour=$joura
         if [ $mois -eq 2 ]
         then
          if [ $joura -gt 28 ]
          then
                [ `expr $an % 4` -ne 0 ] && jour=28 || jour=29
           else
                jour=$joura
           fi
          else
       if [ $moisa -eq 1 -o $moisa -eq 3 -o $moisa -eq 5 -o $moisa -eq 7 -o $moisa -eq 8 -o $moisa -eq 10 -o $moisa -eq 12 ]
       then
      if [ $joura -eq 31 ]
      then
        jour=30
      fi
       else
            jour=$joura
       fi
          fi
         jourf=$jour
         ;;
         
  jour) if [ `expr $ana % 4` -eq 0 ]
         then
                case $moisa in
                01) jour=$joura;;
                02) jour=`expr $joura + 31`;;
                03) jour=`expr $joura + 60`;;
                04) jour=`expr $joura + 91`;;
                05) jour=`expr $joura + 121`;;
                06) jour=`expr $joura + 152`;;
                07) jour=`expr $joura + 182`;;
                08) jour=`expr $joura + 213`;;
                09) jour=`expr $joura + 244`;;
                10) jour=`expr $joura + 274`;;
                11) jour=`expr $joura + 305`;;
                12) jour=`expr $joura + 335`;;
                *)  ERR 1;;
                esac
         else
                case $moisa in
                01) jour=$joura;;
                02) jour=`expr $joura + 31`;;
                03) jour=`expr $joura + 59`;;
                04) jour=`expr $joura + 90`;;
                05) jour=`expr $joura + 120`;;
                06) jour=`expr $joura + 151`;;
                07) jour=`expr $joura + 181`;;
                08) jour=`expr $joura + 212`;;
                09) jour=`expr $joura + 243`;;
                10) jour=`expr $joura + 273`;;
                11) jour=`expr $joura + 304`;;
                12) jour=`expr $joura + 334`;;
                *)  ERR 1;;
                esac
        fi
        jour=`expr $jour $fct $delai`
       
        [ `expr $ana % 4` -eq 0 ] && \
         {
                jouran=0
                if [ $jour -le 0 ]
                then
                        jouran=`expr \( $jour / 366 \) + 1`
                        jour=`expr $jour + 365`
                fi
                if [ $jour -gt 366 ]
                then
                        jouran=`expr $jour / 366`
                        jour=`expr $jour % 366`
                fi
               
                if [ $jour -gt 0 -a $jour -le 31 ]
                       then
                        mois=1
                        jourf=$jour
                       fi
                if [ $jour -gt 31 -a $jour -le 60 ]
                        then
                          jourf=`expr $jour - 31`
                          mois=2
                         fi
                if [ $jour -gt 60 -a $jour -le 91 ]
                        then
                          jourf=`expr $jour - 60`
                          mois=3
                        fi
               if [ $jour -gt 91 -a $jour -le 121 ]
                        then
                          jourf=`expr $jour - 91`
                          mois=4
                        fi
                if [ $jour -gt 121 -a $jour -le 152 ]
                        then
                          jourf=`expr $jour - 121`
                          mois=5
                         fi
                if [ $jour -gt 152 -a $jour -le 182 ]
                        then
                          jourf=`expr $jour - 152`
                          mois=6
                        fi
                if [ $jour -gt 182 -a $jour -le 213 ]
                        then
                          jourf=`expr $jour - 182`
                          mois=7
                        fi
                if [ $jour -gt 213 -a $jour -le 244 ]
                        then
                          jourf=`expr $jour - 213`
                          mois=8
                        fi
                if [ $jour -gt 244 -a $jour -le 274 ]
                        then
                          jourf=`expr $jour - 244`
                          mois=9
                        fi
                if [ $jour -gt 274 -a $jour -le 305 ]
                        then
                          jourf=`expr $jour - 274`
                          mois=10
                        fi
                if [ $jour -gt 305 -a $jour -le 335 ]
                        then
                          jourf=`expr $jour - 305`
                          mois=11
                         fi
                if [ $jour -gt 335 -a $jour -le 366 ]
                       then
                        jourf=`expr $jour - 335`
                        mois=12
                       fi
                 an=`expr $ana $fct $jouran`         
               
         } || \
         {
                jouran=0
                if [ $jour -le 0 ]
                then
                        jouran=`expr \( $jour / 365 \) + 1`
                        jour=`expr $jour + 365`
                fi
                if [ $jour -gt 365 ]
                then
                        jouran=`expr $jour / 365`
                        jour=`expr $jour % 365`
                fi
                if [ $jour -gt 0 -a $jour -le 31 ]
                       then
                        jourf=$jour
                        mois=1
                       fi
               
                if [ $jour -gt 31 -a $jour -le 59 ]
                       then
                        jourf=`expr $jour - 31`
                        mois=2
                       fi
               
                if [ $jour -gt 59 -a $jour -le 90 ]
                       then
                        jourf=`expr $jour - 59`
                        mois=3
                       fi
               
                if [ $jour -gt 90 -a $jour -le 120 ]
                       then
                        jourf=`expr $jour - 90`
                        mois=4
                       fi
               
                if [ $jour -gt 120 -a $jour -le 151 ]
                       then
                        jourf=`expr $jour - 120`
                        mois=5
                       fi
               
                if [ $jour -gt 151 -a $jour -le 181 ]
                       then
                        jourf=`expr $jour - 151`
                        mois=6
                       fi
               
                if [ $jour -gt 181 -a $jour -le 212 ]
                       then
                        jourf=`expr $jour - 181`
                        mois=7
                       fi
               
                if [ $jour -gt 212 -a $jour -le 243 ]
                       then
                        jourf=`expr $jour - 212`
                        mois=8
                       fi
               
                if [ $jour -gt 243 -a $jour -le 273 ]
                       then
                        jourf=`expr $jour - 243`
                        mois=9
                       fi
               
                if [ $jour -gt 273 -a $jour -le 304 ]
                       then
                        jourf=`expr $jour - 273`
                        mois=10
                       fi
               
                if [ $jour -gt 304 -a $jour -le 334 ]
                       then
                        jourf=`expr $jour - 304`
                        mois=11
                       fi
               
                if [ $jour -gt 334 -a $jour -le 365 ]
                       then
                        jourf=`expr $jour - 334`
                        mois=12
                       fi
                an=`expr $ana $fct $jouran`     
         }
if [ `expr $an % 4` -eq 0 -a `expr $ana % 4` -ne 0 ]
then
        [ $mois -eq 3 -a $jourf -eq 1 ] && jourf=29 && mois=2
        [ $mois -eq 3 -a $jourf -gt 1 ] && jourf=`expr $jourf - 1`
        [ $mois -gt 3 ] && jourf=`expr $jourf - 1`
fi
         ;;
esac


[ `expr length $jourf` -eq 1 ] && jourf=`echo "0"$jourf`
[ `expr length $mois` -eq 1 ] && mois=`echo "0"$mois`

res=$jourf$separ$mois$separ$an
REPONSE $res
}
#------------------------
#  erreur
#------------------------
ERR()
{
if [ $silence -eq 1 ]
then
        case $1 in
        1) echo 1;;
        2) echo 2;;
        3) echo 3;;
        4) echo 4;;
        5) echo 5;;
        6) echo 6;;
        7) echo 7;;
        *) exit;;
        esac
else
        case $1 in
        1) echo "Le mois doit etre un entier compris entre 01 et 12";;
        2) echo "Le jour doit etre un entier compris entre 01 et 31";;
        3) echo "Le format de date n'est pas reconnu";;
        4) echo "La fonction \"$2\" n'est pas reconnue. ( seulement + ou - )";;
        5) echo "Il manque des parametres";;
        6) echo "Le type de delai \"$2\" n'est pas reconnu. (jour/mois/annee)";;
        7) echo "Les separateurs entre jour mois annee ne sont pas identiques";;
        *) exit;;
        esac
fi
exit
}
#---------------------------------------
#  resultat du programme ok ou erreur
#---------------------------------------
REPONSE()
{
echo $1
fin=1
exit 0
}
#--------------------------------
#  MAIN()
#--------------------------------

chm=/usr2/paybox/tpewebv2/olive

case $# in
5) if [ $5 ]
   then
     [ $5 = "s" ] && silence=1 || silence=0
   else
     silence=1
     ERR 5   
   fi;;
4) if [ $4 ]
   then
     [ $4 = "s" ] && \
   {
    silence=1
    ERR 5
   } || \
   {
    silence=0
   }
   else
     silence=0   
   fi;;
*) silence=1
   ERR 5;;
esac 

P1 $1 $2 $3 $4
[ $p3 -eq 1 -a $fin=0 ] && P3 $1 $2 $3 $type

}



C'est sur c'est un peu long, mais plus c'est long, plus... 8)

J'espère que ça servira au moins à quelques uns :P

Mais surtout n'hésitez pas à critiquer, il n'est jamais trop tard pour mieux faire.
Avatar de l’utilisateur
yahnice
Quartier Maître
Quartier Maître
 
Messages: 23
Inscrit le: 03 Fév 2005 16:38


Retour vers Autres bavardages

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité

cron