IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Exécuter 2 boucles while avec deux variables en même temps.


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Exécuter 2 boucles while avec deux variables en même temps.
    Bonjour,

    J'ai un code shell ou je veux lire les noms de fichiers qui ont un incerement numérique, et les retourne avec des noms qui contiennent des dates.
    Ça c'est mon script principal que je veux lui ajoute un autre script qui génère les dates pour avoir en output un fichier contenant la date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    nbr=486
    while [ $nbr -lt 2071  ]; do
     
    echo "numero = $nbr"
    tick=`printf "%08d" $nbr`
    echo "ticket = $tick"
     
    r.diag joinup ${output_dir}/trlm_${date}_TMP ${input_dir}/${pm_file}${tick} ${input_dir}/${dm_file}${tick}
     
    nbr=$((nbr + 18))
     
    done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    debut=2010010100
    fin=2010013118
    deltastamp=06
    date=${debut}
     
    while test "${date}" -le "${fin}"
     
    do
            echo ${date}
     date=`r.date -V $date +${deltastamp} | cut -c1-10`
     
    done
    N.B: la commande r.date est une commande spécifique sur mon serveur qui génère les dates.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    Super!
    Mais où est la question?

    (J'imagine que tu as en tête un fichier d'entrée et un fichier de sortie: écris-les ici)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour,

    Super!
    Mais où est la question?

    (J'imagine que tu as en tête un fichier d'entrée et un fichier de sortie: écris-les ici)
    Ma question est comment je peux faire rouler les deux boucle en parallèle

    Boucle 1 : sert a la lecture des fichiers d’entrée. (pm_{nbr} et dm_{nbr}) qui s'increment par pas de 18.
    Boucle 2 : sert a l’écriture des nouveaux fichiers avec la date comme nom de fichier de sortie (full_{date})

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour,

    Comprend toujours pas le problème, étant donné que tu as écrit 2 boucles qui font chacune un travail bien particulier, pourquoi ne pas faire une seule boucle qui fait les 2 travaux à la fois (le tout est de savoir qui pilote: la date ou l'incrément ?).

    Une question au passage: pourquoi utiliser 2 écritures différentes de la commande "test" ?
    Cordialement.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Comprend toujours pas le problème, étant donné que tu as écrit 2 boucles qui font chacune un travail bien particulier, pourquoi ne pas faire une seule boucle qui fait les 2 travaux à la fois (le tout est de savoir qui pilote: la date ou l'incrément ?).

    Une question au passage: pourquoi utiliser 2 écritures différentes de la commande "test" ?

    Merci pour votre retour,

    Je veux faire une seule boucle qui est piloter par l'incrément , ensuite a chaque pas d'incrément je veux appeler la 2eme boucle ou 2eme travail , qui générera la date correspondante a l'incrément.

    Si j'ai bien compris votre suggestion , vous proposez de faire une boucle imbriqué dans l'autre , et cela ne fonctionnera pas par ce que pour i incrément toute la plage des dates va être générer et ce n'est pas ça que je cherche.

    La deuxième boucle servira juste a généré une chaîne de caractère "date" qui va être attribuer au nom fichier de sortie

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while test ${pas_1:-0} -lt 4
    do
       pas_1=$(($pas_1+1))
       pas_2=$(($pas_2+4))
       echo "pas_1 = $pas_1 ;; pas_2 =  $pas_2"
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       pas_1=$(($pas_1+1))
       pas_2=$(($pas_2+4))
    Pourquoi les '$' pour $pas_1 et $pas_2 ?
    Cordialement.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while test ${pas_1:-0} -lt 4
    do
       pas_1=$(($pas_1+1))
       pas_2=$(($pas_2+4))
       echo "pas_1 = $pas_1 ;; pas_2 =  $pas_2"
    done
    C'est pas ça que je cherche,
    j'ai deux test a faire en même temps un sur l'incrément et un autre sur la date.

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    montres-nous ce que la sortie que tu veux obtenir, s'il te plaît.

    une incrémentation de $nbr (pas_1) = une incrémentation de $date (pas_2) ? j'ai juste omis un test sur $pas_2.
    pour sortir d'une boucle, cf. break.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    montres-nous ce que la sortie que tu veux obtenir, s'il te plaît.

    une incrémentation de $nbr (pas_1) = une incrémentation de $date (pas_2) ? j'ai juste omis un test sur $pas_2.
    pour sortir d'une boucle, cf. break.
    Mon probleme est resolu en utilisant un a la fin de la boucle intérieure.

    voici mon code fonctionnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
     
    debut=2009010106
    fin=2009013118
    deltastamp=06
    date=${debut}
     
    set -x
    nbr=486
    while [ $nbr -lt 2701  ]; do
     
    while test "${date}" -le "${fin}"; do
     
    echo "numero = $nbr"
    tick=`printf "%08d" $nbr`
    echo "ticket = $tick"
     
    r.diag joinup ${output_dir}/trlm_${date}_TMP ${input_dir}/${pm_file}${tick}'p' ${input_dir}/${dm_file}${tick}'p'
     
    echo "zap('-1',-1,'LAMVAR')" | editfst -s ${output_dir}/trlm_${date}_TMP -d ${output_dir}/trlm_${date}
     
     
    rm -f ${output_dir}/trlm_${date}_TMP
     
     
     date=`r.date -V $date +${deltastamp} | cut -c1-10`
    break 
    done 
     
    nbr=$((nbr + 18))
    done

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Je n'aime pas les cassures.

    J'aurais plutôt tendance à alimenter ma boucle par son entrée standard avec le résultat de la commande qui fournit la liste de dates.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while [ $nbr -lt 2701  ]
    do
        if blablabla
        then
            read maDate
        fi
        nbr=$((nbr+1))
    done < <(./processus_fournisseur_de_dates.bash)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    C'est peut-être méchant de dire ça, mais c'est l'exemple parfait de ce qu'il ne faut pas faire.
    Une réécriture du "if" sous forme de boucle qui n'en est plus une...

    De plus, ici, contrairement à ce que tu as répondu, le directeur est la date et non l'incrément.

    Pour être plus propre, retire le break, remplace ton 2ème "while" par "if", le 2ème "do" par "then" et le premier "done" par "fi", cela devrait te donner le même résultat et tu réfléchira moins à ce que cela fait si tu dois un jour reprendre le code
    Cordialement.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    C'est peut-être méchant de dire ça, mais c'est l'exemple parfait de ce qu'il ne faut pas faire.
    Une réécriture du "if" sous forme de boucle qui n'en est plus une...

    De plus, ici, contrairement à ce que tu as répondu, le directeur est la date et non l'incrément.

    Pour être plus propre, retire le break, remplace ton 2ème "while" par "if", le 2ème "do" par "then" et le premier "done" par "fi", cela devrait te donner le même résultat et tu réfléchira moins à ce que cela fait si tu dois un jour reprendre le code
    Ça marche pas, ca renvois not found [No such file or directory]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    set -x
    nbr=486
    while [ $nbr -lt 2701  ]; do
     
    if "${date}" -le "${fin}"; then 
     
    echo "numero = $nbr"
    tick=`printf "%08d" $nbr`
    echo "ticket = $tick"
     
    r.diag joinup ${output_dir}/trlm_${date}_TMP ${input_dir}/${pm_file}${tick}'p' ${input_dir}/${dm_file}${tick}'p'
     
    echo "zap('-1',-1,'LAMVAR')" | editfst -s ${output_dir}/trlm_${date}_TMP -d ${output_dir}/trlm_${date}
     
     
    rm -f ${output_dir}/trlm_${date}_TMP
     
     
     date=`r.date -V $date +${deltastamp} | cut -c1-10`
     
    fi 
     
    nbr=$((nbr + 18))
    done

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while [ $nbr -lt 2701  ]; do
    
       if test "${date}" -le "${fin}"; then
    not found [No such file or directory]ce n'est sûrement pas le message complet
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle While avec nombre variable de conditions
    Par jazzybluesy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/09/2012, 19h05
  2. boucle while - passe deux fois dans la boucle.
    Par Benji01 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/05/2008, 12h23
  3. [Tableaux] Switch avec deux variables, comment ?
    Par sandddy dans le forum Langage
    Réponses: 5
    Dernier message: 27/09/2007, 10h14
  4. Boucle while avec action sur table SQL
    Par kamikazbe dans le forum JDBC
    Réponses: 4
    Dernier message: 01/06/2007, 11h46
  5. [JSTL] boucle forEach pour deux liste en même temps
    Par ruud002 dans le forum Taglibs
    Réponses: 1
    Dernier message: 28/09/2006, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo