Forum Programmation.c explication d'un script

Posté par  .
Étiquettes : aucune
0
10
août
2006
Bonjour,

Est ce que quelqu'un pourrait m'expliquer ce que fait ce script, je doit l'utiliser mais je connais très mal le langage et n'ai plus de nouvelles du programmeur.

Je dois générer des images mais quelque soit la valeur que je donne aux paramètres "date_deb" et "nbjour" j'obtient toujours la même chose or selon le programmeur "nbjour" serait un pas ce qui apparemment n'est pas le cas....
Voici le programme:
#!/bin/bash

if [ $# -ne 9 ]
then
echo Il manque un ou plusieurs arguments:
echo La syntaxe est:
echo $0 date_deb nbjour maille long_min long_max lat_min lat_max dossier sortie
exit -1
fi
sep=/
concat=concat
synthese=syntheseV
dir=$(pwd)

cd $9
if [ -e appendfile ]
then
echo Removing old appendfile
rm appendfile*
fi

cd $dir
my=MY*
k=0

for i in $8$my
do


declare -i deb=`expr length $8`
deb=`expr $deb+19`

fin=`expr substr $i $deb 7`
taille=`expr 7 - length $fin`
declare -i jour
case "$taille" in
"0")
jour=10#`expr substr $fin 1 3`
;;
"1")
jour=10#`expr substr $fin 1 2`
;;
"2")
jour=10#`expr substr $fin 1 1`
;;

esac
sepa=_

deb=`expr length $8`
deb=`expr $deb+15`
annee=`expr substr $i $deb 4`


declare -i max=`expr $1+$2`

if [ $k -eq '0' ]
then
appendfile=appendfile$annee$sepa$1$sepa$max
k=1
fi


if [ "$jour -ge $1" -a "$jour -lt $max" ]

then
$dir$sep$concat $i $9$appendfile
fi
done
echo Construction des images et statistiques
$dir$sep$synthese $1 $2 $3 $4 $5 $6 $7 $8 $9 $appendfile

Merci beaucoup.
  • # Indice

    Posté par  . Évalué à 2.

    Bon, comme ton script est long et que j'ai pas trop le temps, je peux pas te répondre catégoriquement mais voilà :

    quand tu as if [ $A -ne $B ]
    ca veut dire "$A not equal $B"

    quand tu as if [ $A -ge $B ]
    ca veut dire "$A greater or equal $B"

    quand tu as `toto` toto est éxecuté avant et on se sert du résultat dans la ligne (attention au sens des quotes, ' et " n'ont pas le même sens)

    Je te conseil de chercher de la doc sur bash par ce que là je ne te donne de clés que pour 10% de ton code

    PS : si le code en question devra encore être repris, commente le car ton prédécesseur te laisse dans de beaux draps
  • # :)

    Posté par  . Évalué à 3.

    Tu as encore des soucis avec ce programme on dirait... Je ne pense pas que ce script shell soit la cause de tes ennuis, mais voici grosso modo ce qu'il fait:


    #!/bin/bash

    # ce script necessite neuf arguments, on verifie qu'ils sont bien la
    if [ $# -ne 9 ]; then
       echo Il manque un ou plusieurs arguments:
       echo La syntaxe est:
       echo $0 date_deb nbjour maille long_min long_max lat_min lat_max dossier sortie
       exit -1
    fi

    # separateur de dossiers
    sep=/
    # executable realisant la concatenation
    concat=concat
    # executable realisant la synthese
    synthese=syntheseV
    # dossier courant
    dir=$(pwd)

    # $9 est le dossier de sortie, on se place dedans
    cd $9

    # on verifie s'il existe un 'appendfile' dedans, on le supprime le cas echeant
    if [ -e appendfile ]; then
       echo Removing old appendfile
        rm appendfile*
    fi

    # on revient dans le dossier courant
    cd $dir


    my=MY*
    k=0

    # pour tous les fichiers commencant par MY du dossier de travail ($8):
    for i in $8$my; do
      # declare un entier deb contenant la taille du nom du dossier de travail ($8)
      # cela permet de travailler par la suite sur le nom de fichier commencant en MY
       declare -i deb=`expr length $8`
       # on ajoute 19 a deb
       deb=`expr $deb+19`

       # on prend une sous chaine de longueur 7 a partir du deb ieme caractere de $i
      # donc cela revient a selectionner les asterisques dans le nom de fichier suivant:
      # dossier_de_travail($8)/MY?????????????????*******
       fin=`expr substr $i $deb 7`
      # taille est egal a 7 - la longueur de la sous chaine recuperee a l'instant
       taille=`expr 7 - length $fin`

       # on declare un entier jour
       declare -i jour

     
       case "$taille" in
       "0")
      # si la taille vaut 0, on donne a jour la valeur des 3 premiers caracteres de $fin en base 10
       jour=10#`expr substr $fin 1 3`
       ;;
       "1")
      # idem avec deux caracteres de fin
       jour=10#`expr substr $fin 1 2`
       ;;
       "2")
      # toujours pareil, avec un seul caractere
       jour=10#`expr substr $fin 1 1`
       ;;
     
       esac

       # ne pas confondre avec $sep qui vaut /
       sepa=_

       # on reinitialise deb a la longueur du dossier de travail
       deb=`expr length $8`
      # cette fois-ci on commence a 15
       deb=`expr $deb+15`
       # on recupere une sous chaine de taille 4 a partir de $deb dans le nom de fichier $i
      # cela revient a recuperer les asterisques dans le nom suivant:
      # dossier_de_travail($8)/MY?????????????****xxxxxxx
       # (x represente la partie d'ou on a extrait le jour tout a l'heure)
       annee=`expr substr $i $deb 4`
     
       # on declare max, contenant l'addition de date_deb ($1) et nbjour
       declare -i max=`expr $1+$2`

      # on a initialise k a zero avant la boucle
        if [ $k -eq '0' ]; then
        # si k = 0 (premier fichier de la liste), on definit appendfile sous la forme suivante:
        # appendfileANNEE_DATEDEB_MAX
        # avec MAX l'addition de date_deb et nbjour
         appendfile=appendfile$annee$sepa$1$sepa$max
         # on met k a 1, on ne repassera plus ici par la suite, donc
         k=1
       fi

      # si la valeur jour qu'on a trouve dans le nom de fichier est superieure ou egale
       # a date_deb et strictement inferieure a MAX:
       if [ "$jour -ge $1" -a "$jour -lt $max" ]; then
         # on appelle concat dans le dossier original avec le nom du fichier, et appendfile
         $dir$sep$concat $i $9$appendfile
       fi
    done

    echo Construction des images et statistiques
    # ici on appelle syntheseV dans le dossier original en lui repassant tous les
    # parametres du script et le fichier appendfile qu'on vient de creer au dessus
    $dir$sep$synthese $1 $2 $3 $4 $5 $6 $7 $8 $9 $appendfile



    Rien de bien sorcier comme tu vois, je pense que le problème est dans ton executable syntheseV de la dernière fois.
    • [^] # Re: :)

      Posté par  . Évalué à 1.

      Rien de bien sorcier...... :)

      En fait je doit générer des images satellites sur des périodes différentes, 5jours, 10 jours .....
      Le problème c'est que le programme aurait été fait de tel sorte que le paramètre date_deb serait le jour julien et que "nbjour" serait un pas. Donc quand je rentre des données sur 15 jours par exemple, je ne devrait pas obtenir la même chose selon la date du jour et le pas. Or même si je tappe 0 0 j'obtient la même chose, en fait il ne tient compte que de la taille du fichiers en entrée.

      Je voudrais être sur que se soit bien ça, cela ne me pose pas de problème qu'il n'y ai pas de pas mais j'ai quand même deux paramètres qui ne servent à rien!

      Dans le script , on dit que si la valeur jour qu'on a trouvé dans le nom de fichier est superieure ou egale
      # a date_deb et strictement inferieure a MAX:
      # on appelle concat dans le dossier original avec le nom du fichier donc cela devrait changé selon les paramètres tapés?
      Ou alors cela n'a d'impact que sur le nom du fichier en sortie? Car effectivement mes fichiers sont de la forme "le2004_1_6_imageHH.raw " avec 1 date_deb et 6 date_deb + nbjour.

      Dans syntheseV on ne parle pas de ses deux paramètres donc je ne pense pas que ça vienne de là.....
      • [^] # Re: :)

        Posté par  . Évalué à 2.

        Hmm, en fait je ne vois pas trop à quel moment le pas est censé intervenir, lors de la création du gros appendfile ou lors de la synthèse ?

        Le script prend tous les fichiers commençant par MY du dossier indiqué en paramètre, et les ajoute un par un à appendfile si et seulement si $jour (calculé à partir du nom de fichier) est dans les clous ($jour >= date_deb et $jour < date_db+nbjour).

        Donc même si le script ne marche pas très bien, logiquement on ne peut qu'avoir des images en trop ou en moins dans appendfile (donc des sorties différentes).

        Ou alors, il se trompe completement en lisant le jour et tombe sur une valeur qui passe toujours le test, auquel cas tu auras effectivement systématiquement l'ensemble des images du dossier dans appendfile.

        Je pense qu'il serait intéressant d'ajouter:

        echo "Fichier courant: $i JOUR=$jour ANNEE=$annee date_deb+nbjour=$max"

        juste avant:
        if [ "$jour -ge $1" -a "$jour -lt $max" ]

        pour voir si le script interprète correctement les noms de fichiers (la méthode étant quelque peu rustique, c'est une possibilité à considérer).
        • [^] # Re: :)

          Posté par  . Évalué à 1.

          Je pense qu'il interprète correctement les noms de fichiers.

          J'ai lancé MainScript en tapant des paramètres différents par exemple:
          MainScript 1 15 0.125 -25 20 0 25 /mnt/porto/sde1/vanessa/Save/Area/15j/ /mnt/porto/sde1/vanessa/tmp/essai_1_15/

          Voici le début et la fin de ce qu'il fait:

          "Fichier courant: /mnt/porto/sde1/vanessa/Save/Area/15j/MYQS_S2A23613.20040011144 JOUR=1 ANNEE=2004 date_deb+nbjour=16

          FILENAME: /mnt/porto/sde1/vanessa/Save/Area/15j/MYQS_S2A23613.20040011144
          sp= 55
          Fichier courant: /mnt/porto/sde1/vanessa/Save/Area/15j/MYQS_S2A23614.20040011145 JOUR=1 ANNEE=2004 date_deb+nbjour=16

          FILENAME: /mnt/porto/sde1/vanessa/Save/Area/15j/MYQS_S2A23614.20040011145
          sp= 127

          (.............)

          Fichier courant: /mnt/porto/sde1/vanessa/Save/Area/15j/MYQS_S2A23821.20040160349 JOUR=16 ANNEE=2004 date_deb+nbjour=16

          FILENAME: /mnt/porto/sde1/vanessa/Save/Area/15j/MYQS_S2A23821.20040160349
          sp= 127
          Fichier courant: /mnt/porto/sde1/vanessa/Save/Area/15j/MYQS_S2A23822.20040160350 JOUR=16 ANNEE=2004 date_deb+nbjour=16

          FILENAME: /mnt/porto/sde1/vanessa/Save/Area/15j/MYQS_S2A23822.20040160350
          sp= 30
          ******PROCESSING********
          ********************
          Creation de l'image
          /mnt/porto/sde1/vanessa/tmp/essai_1_15/e2004_1_16_ecartypeHH.raw
          /mnt/porto/sde1/vanessa/tmp/essai_1_15/e2004_1_16_ecartypeVV.raw
          /mnt/porto/sde1/vanessa/tmp/essai_1_15/e2004_1_16_nbvalueVV.raw
          /mnt/porto/sde1/vanessa/tmp/essai_1_15/e2004_1_16_nbvalueHH.raw
          il ya 128 pixel sans valeur dans /mnt/porto/sde1/vanessa/tmp/essai_1_15/e2004_1_16_imageHH.raw
          il ya 123 pixel sans valeur dans /mnt/porto/sde1/vanessa/tmp/essai_1_15/e2004_1_16_imageVV.raw
          col=360 ligne=200

          Image cree à partir de: 5774570 valeurs"

          Je n'ai pas tout mis , c'est beaucoup trop long.
          Quelque soit les paramètres que je tappe j'obtiens toujours la même chose, seul date_deb+nbjour change.
          Je viens de remarquer que le nombre de valeur à partir de laquelle l'image est crée peut changer mais ceci ne se voit pas dans les images.....
          Par exemple, en tapant 1 et 5 j'obtiens:

          "Image cree à partir de: 2887285 valeurs"

          Mais je ne sais pas si cela à de l'importance ou non.....




          [
          • [^] # Re: :)

            Posté par  . Évalué à 2.

            Donc apparemment, le script fait bien son travail; il collecte les images entre date_deb et (date_deb+nbjour) et les concatène dans appendfile.

            Par contre j'ai vérifié dans syntheseW.c, celui-ci n'utilise pas du tout les paramètres date_deb et nbjour. D'un autre côté, le programme travaille exclusivement à partir du résultat "appendfile" de MainScript, donc normalement les bonnes images... Tout ça est assez mystérieux :)

            Quels résultats devraient tu obtenir ? L'idéal serait de pouvoir comparer les résultats du programme sur un jeu d'essai au résultat connu, afin de déterminer si l'implémentation est correcte. Peut être est-ce normal d'obtenir des résultats proches pour différentes périodes de cet échantillon (données monotones) ? Les résultats sont-ils toujours similaires en faisant tourner le programme sur une série différente ?
            • [^] # Re: :)

              Posté par  . Évalué à 1.

              C'est quoi au juste un apendfile?

              Malheureusement je ne sais pas quels résultats je dois obtenir, puisque c'est l'objet de mon travail ; étudier des images satellites et obtimiser celles-ci en trouvant une période et une maille correcte. Je n'ai aucun moyen de comparaison, ces données n'ont jamais été utilisées auparavant.

              Effectivement j'obtiens des résultats diffférents pour des périodes en entrée différentes (5j,10j...). Donc à priori le programme prend en compte tout ce qu'il ya dans mon fichier en entrée. Mais suis je bien sure qu'il prend TOUT en compte et que cela ne dépend pas (même peu) de mes paramètres date_deb et nbjour. Car je dois en avoir la certitude. De toute façon cela n'est pas très rigoureux d'avoir 2 paramètres "inutiles"....

              En ce qui concerne le nombre de valeur à partir de laquelle l'image est crée le problème venait du fait que le fichier en sortie n'écrase pas ce qu'il y avait avant, je dois créer un nouveau fichier. Et alors quelque soit la valeur des paramètres tappés j'obtiens toujours la même valeur .

              Il n'est pas possible de faire les choses à l'envers, c'est à dire de lancer sytheseV "manuellement"ou quelque chose dans le genre ?
              • [^] # Re: :)

                Posté par  . Évalué à 2.


                Donc à priori le programme prend en compte tout ce qu'il ya dans mon fichier en entrée. Mais suis je bien sure qu'il prend TOUT en compte et que cela ne dépend pas (même peu) de mes paramètres date_deb et nbjour. Car je dois en avoir la certitude.


                Les paramètres date_deb et nbjour ne sont en fait utilisés que par MainScript, pour sélectionner toutes les images de la période donnée et les grouper dans le fichier "appendfile" (le programmeur original y fait référence par ce nom, c'est le fichier donné en entrée à syntheseV).

                D'après ce que tu me dis sur la nature des traitements, je suppose que ces paramêtres ne devraient pas intervenir dans les calculs de syntheseV, et je peux t'assurer que c'est le cas :) Dans syntheseV, date_deb et nbjour sont lus mais ne sont jamais utilisé par la suite.


                En ce qui concerne le nombre de valeur à partir de laquelle l'image est crée le problème venait du fait que le fichier en sortie n'écrase pas ce qu'il y avait avant, je dois créer un nouveau fichier. Et alors quelque soit la valeur des paramètres tappés j'obtiens toujours la même valeur .


                Tu fais référence aux messages comme "Image cree à partir de: 5774570 valeurs" ?

                Sinon, pour utiliser syntheseV directement, il faudrait qu'il lise lui même les images traitées par MainScript, mais apparemment MainScript fait son travail correctement (donc ça serait une perte de temps). En fait, ça ressemble à un repentir du programmeur; au début, syntheseV aurait probablement du faire le travail de MainScript mais le codeur a probablement du trouver plus rapide et commode de déléguer la sélection des images à un script externe (d'où les paramètres inutilisés dans syntheseV).
                • [^] # Re: :)

                  Posté par  . Évalué à 1.

                  Je faisais effectivement référence aux messages comme "Image cree à partir de: 5774570 valeurs" .

                  Si ces paramètres n'interviennent pas dans les calculs de syntheseV alors c'est génial, je continue comme ça.

                  Merci beaucoup pour ton aide (encore une fois).
                  :)

Suivre le flux des commentaires

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