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 :

Commande for à deux conditions


Sujet :

Shell et commandes GNU

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut Commande for à deux conditions
    bonjour,
    J'ai fait un script mais il ne veut pas accepter les deux conditions pour une boucle For.
    voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for f1 in *.tfa.txt && f2 in *.txt
    do
    java Teiresias $f1 $f2
    done
    est-ce exacte cette For?
    Merci

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 352
    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 352
    Par défaut
    Bonjour,

    Non, for sous cette syntaxe, ne peux prendre qu'un seul paramètre de liste.

    Si tu es sous bash, le plus simple est de passer par 2 tableaux f1 et f2 ainsi tu les parcourir en même temps via le même indice.

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    désolé je ne suis pas expert en script shell.
    Comment faire ça s'il te plait? sinon avec le "While" est-ce que c'est possible?
    Merci

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Il y a plusieurs façons de comprendre ce qui est attendu. En voici une:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for f1 in *.tfa.txt; do
        for f2 in *.txt; do
            java Teiresias $f1 $f2
        do
    done
    Si pas ça, il faudrait nous expliquer avec un exemple concret les paramètres qui doivent être passé à la commande "java Teiresias".

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    non le code à double For imbriqué est pas possible.
    je veux qu'il prend en même temps les deux fichiers(de deux différents dossiers).
    c'est à dire:
    java Teiresias 1.tfa.txt 1.txt
    java Teiresias 2.tfa.txt 2.txt
    java Teiresias 3.tfa.txt 3.txt
    java Teiresias 4.tfa.txt 4.txt
    java Teiresias 5.tfa.txt 5.txt
    ....
    est-ce que vous pouvez m'aider? Je ne suis pas expert en shell mais je suis obligé de passer par shell.
    MErci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    Bonjour,

    apparmement, à tout fichier .tfa.txt correspond un fichier .txt, et réciproquement.

    il faut simplement "découper" le nom de fichier pour ne garder que la "racine", et lui adjoindre l'extension du fichier complémentaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for f in ./*.txt
    do
       echo "${f%.*}.tfa.txt && $f"
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    non non!
    c'est juste un exemple pour monter que se sont deux différents fichiers et deux différents dossiers (chemin).
    ava Teiresias BBA001.tfa.txt 1.txt
    java Teiresias BBA002.tfa.txt 2.txt
    java Teiresias BBA003.tfa.txt 3.txt
    java Teiresias BBA004.tfa.txt 4.txt
    java Teiresias BBA005.tfa.txt 5.txt

    est-ce qu'il y a une solution pour cette exemple?
    Merci

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 352
    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 352
    Par défaut
    Un exemple:
    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
    $ ls -R
    .:
    rep1  rep2
     
    ./rep1:
    fich1.tfa.txt  fich2.tfa.txt  fich3.tfa.txt  fich4.tfa.txt  fich5.tfa.txt
     
    ./rep2:
    fich1.txt  fich2.txt  fich3.txt  fich4.txt  fich5.txt
    $ f1=(rep1/*)
    $ f2=(rep2/*)
    $ i=-1 ; while ((i++ < ${#f1[@]}-1))
    do 
      echo ${f1[$i]} ${f2[$i]}
    done
    rep1/fich1.tfa.txt rep2/fich1.txt
    rep1/fich2.tfa.txt rep2/fich2.txt
    rep1/fich3.tfa.txt rep2/fich3.txt
    rep1/fich4.tfa.txt rep2/fich4.txt
    rep1/fich5.tfa.txt rep2/fich5.txt
    Le $ en début de ligne est mon prompt.

  9. #9
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    est-ce que tu peux m'expliquer un peut le code?
    en plus pour plusieurs manipulations.(différents fichiers de différents dossiers) est-ce que je dois à chaque fois créer un tableau dans le script shell???
    MErci

  10. #10
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    j'ai ma petite idée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    javac Teiresias.java
    $ i=1;
    for f1 in *.tfa.txt
    do
    f2=$i.txt;
    java Teiresias $f1 $f2
    i=i+1;
    done
    mais il y a un problème dans f2=$i.txt; je veux f2 soit f2=1.txt puis 2.txt puis 3.txt .....
    avec i s'incrémente automatique.
    est-ce que vous pouvez m'aider?
    MErci

  11. #11
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par mido1951 Voir le message
    je veux qu'il prend


    j'ai une question idiote, si on a pas le même nombre de fichiers dans les deux répertoires, ou qu'il y a un décalage (dans le premier répertoire les fichiers vont de 1 à 5 par exemple et dans le deuxième ils vont de 2 à 6, on se retrouve avec java toto "machin1.tfa.txt" "machin2.txt" ou java toto "machin5.tfa.txt" "" etc.) il se passe quoi ? on s'en fout le programme java se débrouille ? ou alors le script doit gérer ce cas particulier ? ou encore ça ne peut jamais arriver parcequ'on sait qu'on a toujours les fichiers de 1 à 9 très exactement ? etc.

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 352
    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 352
    Par défaut
    Je ne vois pas trop ce qu'il faut expliquer ici, c'est les bases du shell, peut-être juste ${#f1[@]} qui le nombre d'éléments du tableau f1.
    (En shell comme dans la plupart des langages, l'indice du premier élément est zéro).

    Ensuite, quelques soient le nombre de fichiers que tu as et leur localité, tu n'auras besoin que de ces 2 tableaux, il faut juste les remplir en conséquence (de la même façon que si tu avais pu utiliser ton formalisme de boucle for).

  13. #13
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    les fichiers dans les deux dossiers sont ordonnés.

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    est-ce que tu peux m'expliquer un peut le code?
    Qu'est-ce que tu ne comprends pas dans ce code?

    en plus pour plusieurs manipulations.(différents fichiers de différents dossiers) est-ce que je dois à chaque fois créer un tableau dans le script shell???
    Comme dirait Jiliagre:
    Citation Envoyé par jlliagre Voir le message
    Il y a plusieurs façons de comprendre ce qui est attendu.
    Pourrais-tu être plus précis sur ce que tu veux?

    Peux-tu décrire précisément quels sont ces "différents fichiers de différents dossiers", ce qu'ils ont en commun, ce qu'ils ont de différent, comment les utiliser?

    Sinon, pour combiner ta toute première proposition for f1 in *.tfa.txt && f2 in *.txt avec la solution proposée par Disdorgue, on pourrait "énumérer en parallèle" les fichiers *.tfa.txt et les autres fichiers *.txt du même répertoire avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    lf_tfa=(*.tfa.txt)
    lf_txt=($(echo *.txt | tr ' ' '\n' | fgrep -v '.tfa.txt'))
    i=-1
    while ((i++ < ${#lf_tfa[@]}-1))
    do echo ${lf_tfa[$i]} ${lf_txt[$i]}
    done
    Est-ce que cela répondrait à ta question?

  15. #15
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    basename est fort utile dans ce genre de cas, notamment son argument optionnel qui spécifie une extension à virer, à croire que ça a été fait pour

    je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    REP1=rep1
    REP2=rep2
     
    for fic1 in ${REP1}/*.tfa.txt; do
       fic2="${REP2}"/$(basename "${fic1}" .tfa.txt)".txt"
       if [ -e "${fic2}" ]; then
          echo "java machin \"${fic1}\" \"${fic2}\""
       else
          echo "probleme, FIC1=\"${fic1}\", FIC2 ne semble pas exister, FIC2=\"${fic2}\""
       fi
    done
    l'arborescence de test est la suivante :
    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
    .
    |   script.sh
    |
    +---rep1
    |      bouzin.tfa.txt
    |      coincoin.tfa.txt
    |      fichier avec espace.tfa.txt
    |      gruik.extension.foireuse
    |      prout.tfa.txt
    |      toto.tfa.txt
    |
    \---rep2
           bouzin.txt
           coincoin.txt
           fichier avec espace.txt
           pouet.txt
           toto.txt
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ./script.sh
    java machin "rep1/bouzin.tfa.txt" "rep2/bouzin.txt"
    java machin "rep1/coincoin.tfa.txt" "rep2/coincoin.txt"
    java machin "rep1/fichier avec espace.tfa.txt" "rep2/fichier avec espace.txt"
    probleme, FIC1="rep1/prout.tfa.txt", FIC2 ne semble pas exister, FIC2="rep2/prout.txt"
    java machin "rep1/toto.tfa.txt" "rep2/toto.txt"

  16. #16
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    non le code à double For imbriqué est pas possible.
    je veux qu'il prend en même temps les deux fichiers(de deux différents dossiers).
    non non!
    c'est juste un exemple pour monter que se sont deux différents fichiers et deux différents dossiers (chemin).
    Donc si on se résume, tu veux deux fichiers de noms quelconques, mais qui sont dans le même ordre dans le dossier.
    Pardon mais ça sent la mauvaise bidouille.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    bash n'a pas besoin de basename, comme je l'ai montré.
    ma solution a été recalée car les noms des fichiers dans les deux répertoires ne sont pas les mêmes.

    +1 Flodelarab
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    les fichiers dans les deux dossiers sont ordonnés.
    Admettons, mais dans quel ordre ?
    Est-on sûr qu'il y a le même nombre de fichiers dans chaque dossier ?
    Et pourquoi ne pas avoir dit dès le début qu'il y avait deux dossiers ?

  19. #19
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    j'ai ma petite idée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    javac Teiresias.java
    $ i=1;
    for f1 in *.tfa.txt
    do
    f2=$i.txt;
    java Teiresias $f1 $f2
    i=i+1;
    done
    mais il y a un problème dans f2=$i.txt; je veux f2 soit f2=1.txt puis 2.txt puis 3.txt .....
    avec i s'incrémente automatique.
    est-ce que vous pouvez m'aider?
    MErci
    Si c'est vraiment ça que tu veux (juste incrémenter i) alors il suffit d'ajouter "let" comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    i=1
    for f1 in *.tfa.txt; do
      f2=$i.txt
      java Teiresias $f1 $f2
      let i=i+1
    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    ce qui, en concis, donne :
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for f in *.tfa.txt
    do
       java Teiresias "$f" $((++i)).txt
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. [FLASH MX2004] Deux conditions dans une boucle
    Par pierrot10 dans le forum Flash
    Réponses: 1
    Dernier message: 06/11/2005, 16h31
  2. Peut on faire un selon à deux conditions ?
    Par Celia1303 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 18/10/2005, 16h16
  3. Instructions select case à deux conditions
    Par Celia1303 dans le forum Access
    Réponses: 15
    Dernier message: 14/10/2005, 16h22
  4. Retour d'erreur avec l'utilisation de la commande For en VBS
    Par genialk2000 dans le forum VBScript
    Réponses: 3
    Dernier message: 30/03/2005, 18h45

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