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 :

Boucle dans une boucle


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut Boucle dans une boucle
    Bonjour,

    Je suis en train de plancher sur un script et je suis bloqué.
    J'aimerais faire une boucle dans une boucle du genre

    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
    for line in $(cat monfichier.txt)
    do
      for i in $(seq 1 9)
      do
        ...
        mes commandes
        ...
      done
      for j in $(seq 1 9)
      do
        ...
        mes commandes
        ...
      done
    done

    mais cela ne fonctionne pas.

    J'ai l'impression qu'il y a une confusion entre les "done".

    Si quelqu'un peut m'aider

    Merci

    Gogoth62

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Sur le principe, ce code devrait fonctionner...

    Qu'est-ce qui ne fonctionne pas ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Oui il est normalement tout à fait possible d'imbriquer des structures itératives ...

    Citation Envoyé par gogoth62 Voir le message
    mais cela ne fonctionne pas.
    Pourrais-tu donner plus de détails ? As-tu un message d'erreur ? Sinon qu'est-ce quel est le comportement du script ? Quel shell utilises-tu ? (Bash ?)

    Peut être qu'avec un code plus complet, on pourra déterminer ou sont les erreurs avec plus de précisions (car là je n'en vois pas).

    Cordialement,
    Idriss

  4. #4
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut
    voicimoncode:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #!/bin/bash
    for line in $(catlistews5000.txt)
    do
     
    dossier=/var/log/log_ws5000/$line/listefichierlog.txt
     
    if [ -f $dossier]
    then
    log=/var/log/log_ws5000/$line/$line.log
    ap01=/var/log/log_ws5000/$line/AP01
    ap02=/var/log/log_ws5000/$line/AP02
    ap03=/var/log/log_ws5000/$line/AP03
    ap04=/var/log/log_ws5000/$line/AP04
    ap05=/var/log/log_ws5000/$line/AP05
    ap06=/var/log/log_ws5000/$line/AP06
    ap07=/var/log/log_ws5000/$line/AP07
    ap08=/var/log/log_ws5000/$line/AP08
    ap09=/var/log/log_ws5000/$line/AP09
    ap10=/var/log/log_ws5000/$line/AP10
    ap11=/var/log/log_ws5000/$line/AP11
    ap12=/var/log/log_ws5000/$line/AP12
    ap13=/var/log/log_ws5000/$line/AP13
    ap14=/var/log/log_ws5000/$line/AP14
    ap15=/var/log/log_ws5000/$line/AP15
    ap16=/var/log/log_ws5000/$line/AP16
    ap17=/var/log/log_ws5000/$line/AP17
    ap18=/var/log/log_ws5000/$line/AP18
    ap19=/var/log/log_ws5000/$line/AP19
    ap20=/var/log/log_ws5000/$line/AP20
    ap21=/var/log/log_ws5000/$line/AP21
    ap22=/var/log/log_ws5000/$line/AP22
    ap23=/var/log/log_ws5000/$line/AP23
    ap24=/var/log/log_ws5000/$line/AP24
    ap25=/var/log/log_ws5000/$line/AP25
    ap26=/var/log/log_ws5000/$line/AP26
    ap27=/var/log/log_ws5000/$line/AP27
    ap28=/var/log/log_ws5000/$line/AP28
    ap29=/var/log/log_ws5000/$line/AP29
    ap30=/var/log/log_ws5000/$line/AP30
     
    for numap in $(seq 1 9 )
    do
     
    AP=AP0$numap
    ap=ap0$numap
     
    if ! [ -f $ap ]
    	then
     
    	if grep offline $Log
    		then
     
    		grep offline $Log > /etc/syslog-ng/tmp;
    		if grep $AP /etc/syslog-ng/tmp
    			then
    			echo"find"
    			rm /etc/syslog-ng/tmp
    			>/var/log/log_ws5000/$line/$AP
     
    			else
    			echo "find offline without"$AP
    			rm /etc/syslog-ng/tmp
    		fi
    		else
    		echo"not find"
    	fi
    	else
    	echo "find fichier"$AP
    fi
     
    done
     
    for numap in$ (seq 10 30 )
    do
     
    AP=AP$numap
    ap=ap$numap
     
    if ! [ -f $ap ]
    	then
    	if grep offline $Log
    		then
    		grep offline $Log >/etc/syslog-ng/tmp;
    		if grep $AP /etc/syslog-ng/tmp
    			then
    			echo "find"
    			rm /etc/syslog-ng/tmp
    			>/var/log/log_ws5000/$line/$AP
    			else
    			echo "find offline without"$AP
    			rm /etc/syslog-ng/tmp
    		fi
    		else
    		echo "notfind"
    	fi
    	else
    	echo "find fichier"$AP
    fi
     
    done
     
    else
     
    echo"fichier de log"$line".log non trouvee"
     
    fi
     
    done

    Le problème est que mon script s'arrête juste après être entré dans le "for numap in $(seq 1 9 )" sans message d'erreur.

    Merci

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Je vois déjà une erreur syntaxique à la ligne 73 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for numap in$ (seq 10 30 )
    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for numap in $(seq 10 30)
    D'ailleurs le bash aurait du te donner cette erreur à l'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ./test.sh: line 73: Erreur de syntaxe près du symbole inattendu « in$ »
    ./test.sh: line 73: `for numap in$ (seq 10 30 )'
    Sinon l'indentation n'est pas terrible, il serait bien de faire un effort.

    Cordialement,
    Idriss

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

    Peux-tu activer le mode debug stp en ajoutant les options suivantes et rééxecuter le script


  7. #7
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut
    pour l'erreur de syntaxe c'est une erreur de copie, je l'avait bien écrit dans mon script.

    Désolé si l'indentation n'est pas super mais je début.

    Voici le résultat de l'exécution avec le -xv
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    cat listews5000.txt)
    cat listews5000.txt
    ++ cat listews5000.txt
    + for line in '$(cat listews5000.txt)'
    + echo 172.23.69.128
    172.23.69.128
    + dossier=/var/log/log_ws5000/172.23.69.128/listefichierlog.txt
    + echo /var/log/log_ws5000/172.23.69.128/listefichierlog.txt
    /var/log/log_ws5000/172.23.69.128/listefichierlog.txt
    + '[' -f /var/log/log_ws5000/172.23.69.128/listefichierlog.txt ']'
    + log=/var/log/log_ws5000/172.23.69.128/172.23.69.128.log
    + ap01=/var/log/log_ws5000/172.23.69.128/AP01
    + ap02=/var/log/log_ws5000/172.23.69.128/AP02
    + ap03=/var/log/log_ws5000/172.23.69.128/AP03
    + ap04=/var/log/log_ws5000/172.23.69.128/AP04
    + ap05=/var/log/log_ws5000/172.23.69.128/AP05
    + ap06=/var/log/log_ws5000/172.23.69.128/AP06
    + ap07=/var/log/log_ws5000/172.23.69.128/AP07
    + ap08=/var/log/log_ws5000/172.23.69.128/AP08
    + ap09=/var/log/log_ws5000/172.23.69.128/AP09
    + ap10=/var/log/log_ws5000/172.23.69.128/AP10
    + ap11=/var/log/log_ws5000/172.23.69.128/AP11
    + ap12=/var/log/log_ws5000/172.23.69.128/AP12
    + ap13=/var/log/log_ws5000/172.23.69.128/AP13
    + ap14=/var/log/log_ws5000/172.23.69.128/AP14
    + ap15=/var/log/log_ws5000/172.23.69.128/AP15
    + ap16=/var/log/log_ws5000/172.23.69.128/AP16
    + ap17=/var/log/log_ws5000/172.23.69.128/AP17
    + ap18=/var/log/log_ws5000/172.23.69.128/AP18
    + ap19=/var/log/log_ws5000/172.23.69.128/AP19
    + ap20=/var/log/log_ws5000/172.23.69.128/AP20
    + ap21=/var/log/log_ws5000/172.23.69.128/AP21
    + ap22=/var/log/log_ws5000/172.23.69.128/AP22
    + ap23=/var/log/log_ws5000/172.23.69.128/AP23
    + ap24=/var/log/log_ws5000/172.23.69.128/AP24
    + ap25=/var/log/log_ws5000/172.23.69.128/AP25
    + ap26=/var/log/log_ws5000/172.23.69.128/AP26
    + ap27=/var/log/log_ws5000/172.23.69.128/AP27
    + ap28=/var/log/log_ws5000/172.23.69.128/AP28
    + ap29=/var/log/log_ws5000/172.23.69.128/AP29
    + ap30=/var/log/log_ws5000/172.23.69.128/AP30
    seq 1 9)
    seq 1 9
    ++ seq 1 9
    + for numap in '$(seq 1 9)'
    + echo 'debut du for'
    debut du for
    + AP=AP01
    + ap=ap01
    + '[' -f ap01 ']'
    + grep offline
    Sinon j'ai essayé de changer ma première boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for line in $(cat listews5000.txt)
    do
    done
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read line
    do
    done < listews5000.txt
    La le script s’exécute correctement pour la première ligne mais sort du while sans lire les autres lignes du fichier

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Il est normal que le script s'arrête sur cette ligne :
    La variable Log n'est pas définie, donc $Log ne retourne rien (une chaine vide) et grep n'ayant pas de nom de fichier en paramètre attend ses données de la console donc du fichier utilisé en entrée de la boucle while read...
    Le dit fichier est ainsi lu jusqu'au bout et on sort de la boucle à la première itération
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Les noms de variables sont case sensitive.

    Tu définis une variable log (avec l minuscule)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    + log=/var/log/log_ws5000/172.23.69.128/172.23.69.128.log
    Ensuite tu tentes de faire un grep $Log (avec l majuscule) => comme cette variable n'a pas de valeur, ton grep plante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    + grep offline <RIEN>
    if grep offline $Log

  10. #10
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut
    Merci beaucoup

    Mon script fonctionne maintenant.

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

Discussions similaires

  1. Utilisation d'une boucle dans une boucle
    Par caramon _majere dans le forum Langage
    Réponses: 5
    Dernier message: 27/09/2014, 21h37
  2. [XL-2003] faire une boucle dans une boucle VBA
    Par the-geut dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/04/2010, 15h06
  3. [PHP 5.0] Manipulation XML une boucle dans une boucle
    Par lepotier dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2010, 12h15
  4. [Tableaux] Boucle dans une boucle
    Par spawns dans le forum Langage
    Réponses: 2
    Dernier message: 12/02/2006, 13h11
  5. Creer une boucle dans une requête ???
    Par fdloisel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/10/2004, 14h05

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