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 :

Double boucle while


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut Double boucle while
    Bonjour,

    Sur 3 serveurs distincts, je souhaite faire un "ls -al" de 2 fichiers "file1" et "file2" que je mets dans un fichier FILE.txt :

    Fichier FILE.txt :
    De la même manière je fabrique un fichier SERVER.txt contenant les 3 serveurs en question et j'imagine une boucle while qui permet de lire ce fichier :

    Fichier SERVER.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SERVER1
    SERVER2
    SERVER3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read Serv; do
         echo $Serv
    done < SERVER.txt

    Je me sers donc de cette boucle while pour y insérer une seconde boucle permettant de lire FILE.txt pour chaque ligne de SERVER.txt.

    Le but est d'aller faire le "ls -al" pour les 2 fichiers sur les 3 serveurs et d'obtenir au final les 3 fichiers :

    FILE_SERVER1.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -rw-r--r-- 1 kevin kevin    21 Oct 13 12:02  file1
    -rw-r--r-- 1 kevin kevin    89 Oct 10 04:36  file2
    FILE_SERVER2.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -rw-r--r-- 1 kevin kevin    37 Oct 13 13:10  file1
    -rw-r--r-- 1 kevin kevin    45 Oct 10 09:01  file2
    FILE_SERVER3.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -rw-r--r-- 1 kevin kevin    11 Oct 09 14:09  file1
    -rw-r--r-- 1 kevin kevin    51 Oct 07 08:30  file2
    Pour cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while read Serv; do
     
            while read File; do
                    ssh $Serv 'ls -al $File'
            done < FILE.txt >> FILE_"$Serv".txt
     
    done < SERVER.txt

    Sauf que je n'obtiens pas la totalité : uniquement 3 fichiers avec le "ls -al" de file1 mais pas du second file2, comme s'il n'y avait qu'un passage pour la seconde boucle.

    Quelque chose m'échappe…!

  2. #2
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    ssh "$Serv" "ls -al $File" ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Merci BALKANY pour ta réponse rapide,
    C'est juste un exemple (pas terrible j'en conviens) mais le souci c'est que la seconde boucle ne s'exécute qu'une fois.

  4. #4
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Je ne vois pas de raison à cela autre que le fait que FILE.txt n'ait qu'une seule ligne, mais en tout cas tu devrais mettre des guillemets doubles comme j'ai fait ci-dessus, car là, ta variable $File n'est pas prise en compte (à moins qu'elle ait une valeur sur la machine distante).

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Merci.
    Le fichier FILE.txt a bien 2 lignes, mais la boucle ne fait qu'un passage pour je ne sais quelle raison.
    Il y a donc un souci dans ces 2 boucles imbriquées, la seconde n'est parcourue qu'une seule fois ! Il doit y avoir une subtilité...

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Si tu as une liste de 50 fichiers, tu fais 50 connexions ssh sur le même serveur, tu ne trouve pas ça un peu bourrin ?

    D'ailleurs, ton souci est à chercher de ce coté là...

  7. #7
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Merci.

    Il faudrait donc pour chaque serveur faire une seul connexion et passer les deux "ls -al" ?

    Pour un serveur, les résultats des 2 "ls -al" doivent être l'un à la suite de l'autre comme dans mon message initial.

    Donc pas de seconde boucle while ? Mais comment faire ?

    Ceci dit je me m'explique pas le fait que dans la seconde boucle il n'y a qu'un passage ?

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

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

    • On n'utilise pas "ls" dans un script. "ls", c'est pour les humains. Les alternatives sont "find" et "stat".
    • Tes "while" imbriqués ne fonctionnent pas car ils se disputent l'entrée standard.
    • Une solution envisageable est l'utilisation de tableau. Mais, attention, ne jamais oublier les double quotes "". Si tes données ont des espaces, c'est la cata, sans double quotes.
      Une boucle for sur les tableaux n'aura plus de problème de flux.


    Code bash : 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
     
    # On prévient que tab est un tableau
    declare -a tab
    #On remplit le tableau
    while IFS='' read ligne
    do 
        tab+=("$ligne")
    done < file.txt
     
    # Cette boucle est un exemple, probablement équivalent à "cat".
    for i in "${tab[@]}"
    do 
        echo "$i"
    done
     
    # On vide le tableau
    unset tab

    Cet exemple ne fait pas d'imbrications. Mais tu sauras faire.


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

Discussions similaires

  1. [MySQL] Double boucle while input select
    Par yurispy dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 15/12/2013, 23h06
  2. [MySQL] Optimisation code double boucle while
    Par heretik25 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/11/2011, 15h38
  3. Quitter une double boucle while
    Par sirop-de-menthe dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/05/2011, 23h05
  4. [PHP 5.3] Soucis avec le résultat d'une requête (double boucles while)
    Par beegees dans le forum Langage
    Réponses: 7
    Dernier message: 31/05/2010, 22h26
  5. [PHP 5.3] Double boucles while, problème d'accès au données de la première
    Par beegees dans le forum Langage
    Réponses: 3
    Dernier message: 09/11/2009, 08h44

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