Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/07/2011, 13h47   #1
Membre à l'essai
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 20
Points : 20
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 :
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
gogoth62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/07/2011, 13h55   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 542
Points : 7 542
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/07/2011, 14h00   #3
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 983
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 983
Points : 6 109
Points : 6 109
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
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/07/2011, 14h11   #4
Membre à l'essai
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 20
Points : 20
voicimoncode:

Code :
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
gogoth62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/07/2011, 14h22   #5
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 983
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 983
Points : 6 109
Points : 6 109
Je vois déjà une erreur syntaxique à la ligne 73 :

Code :
for numap in$ (seq 10 30 )
=>

Code :
for numap in $(seq 10 30)
D'ailleurs le bash aurait du te donner cette erreur à l'exécution :

Code :
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
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 14h24   #6
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 551
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 551
Points : 4 271
Points : 4 271
Salut,

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

__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 14h39   #7
Membre à l'essai
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 20
Points : 20
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 :
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 :
1
2
3
for line in $(cat listews5000.txt)
do
done
Par
Code :
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
gogoth62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/07/2011, 15h01   #8
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 542
Points : 7 542
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/07/2011, 15h09   #9
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 551
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 551
Points : 4 271
Points : 4 271
Les noms de variables sont case sensitive.

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

Code :
+ 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 :
1
2
3
+ grep offline <RIEN>
if grep offline $Log
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/07/2011, 15h19   #10
Membre à l'essai
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 20
Points : 20
Merci beaucoup

Mon script fonctionne maintenant.
gogoth62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h55.


 
 
 
 
Partenaires

Hébergement Web