[SH/BASH] PB de boucle - Conseil & Help SVP
Résolu/Fermé
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
-
25 sept. 2007 à 11:34
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 - 27 sept. 2007 à 14:57
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 - 27 sept. 2007 à 14:57
A voir également:
- [SH/BASH] PB de boucle - Conseil & Help SVP
- Fichier .sh - Forum Ubuntu
- Boucle excel sans macro - Forum Excel
- Fichier sh - Forum Shell
- Minimal bash-like line editing is supported ✓ - Forum Linux / Unix
16 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
25 sept. 2007 à 11:42
25 sept. 2007 à 11:42
Salut,
do echo -e ".\c" sleep 1 done;-))
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
1
25 sept. 2007 à 12:18
25 sept. 2007 à 12:18
Bonjour jipicy,
Tout d'abord merci pour ta réponse rapide :)
Mais j'ai toujours un souci..
Maintenant j'ai bien l'affichage de "points-successifs-sur-une-ligne-à-intervalles-reguliers" comme je le souhaitais :) mais ça boucle sans arrêt :( et ça ne sort jamais de la boucle : du coup, ça génére mon fichier, ça affiche un point, ça génére à nouveau mon fichier, ça affiche un point, etc.
J'ai essayé d'insérer un break pour sortir de la boucle :
mais là il n'y a qu'un point qui s'affiche et puis le script s'arrête puisque le fichier est généré...
Une piste pour boucler sur le point et pas sur la génération du fichier ?
Tout d'abord merci pour ta réponse rapide :)
Mais j'ai toujours un souci..
Maintenant j'ai bien l'affichage de "points-successifs-sur-une-ligne-à-intervalles-reguliers" comme je le souhaitais :) mais ça boucle sans arrêt :( et ça ne sort jamais de la boucle : du coup, ça génére mon fichier, ça affiche un point, ça génére à nouveau mon fichier, ça affiche un point, etc.
J'ai essayé d'insérer un break pour sortir de la boucle :
do echo -e ".\c" sleep 1 break done
mais là il n'y a qu'un point qui s'affiche et puis le script s'arrête puisque le fichier est généré...
Une piste pour boucler sur le point et pas sur la génération du fichier ?
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
25 sept. 2007 à 14:08
25 sept. 2007 à 14:08
The syntax of the while command is:
while test-commands; do consequent-commands; done
while a besoin d'une condtion pour terminer
while test-commands; do consequent-commands; done
while a besoin d'une condtion pour terminer
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
1
25 sept. 2007 à 14:19
25 sept. 2007 à 14:19
Bonjour Dubcek,
En effet, ici ma condition serait :
"tant que les commandes ne sont pas terminées [et donc le fichier généré]"
C'est ce que j'essayais de faire ici :
sachant que <condition> correspond aux instructions suivantes :
le problème c'est que visiblement une fois que les commandes sont terminées et le fichier généré, la boucle ne s'arrête pas :(
Merci de ton aide en tout cas et si tu as une autre piste ? et aussi d'autres CCMnautes ?
je suis preneur de tout avis, aide et conseils :))
En effet, ici ma condition serait :
"tant que les commandes ne sont pas terminées [et donc le fichier généré]"
C'est ce que j'essayais de faire ici :
while <condition> do echo -e ".\c" sleep 1 done
sachant que <condition> correspond aux instructions suivantes :
cat FIC01 FIC02 | grep -v "motif" | sed "s/motif1/motif2/g" | sort -u > FIC03 perl fichier.pl FIC03 > FIC04 etc... (<autres commandes dans le même genre>)
le problème c'est que visiblement une fois que les commandes sont terminées et le fichier généré, la boucle ne s'arrête pas :(
Merci de ton aide en tout cas et si tu as une autre piste ? et aussi d'autres CCMnautes ?
je suis preneur de tout avis, aide et conseils :))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
25 sept. 2007 à 14:39
25 sept. 2007 à 14:39
quelque chose comme cela :
#!/bin/sh echo ">>> Préparation des fichiers de parametres en cours " while true ; do sleep 1 ; echo -e ".\c" ; done & PID=$! grep -v "motif" FIC01 FIC02 | sed "s/motif1/motif2/g" | sort -u > FIC03 perl fichier.pl FIC03 > FIC04 etc... (<autres commandes dans le même genre>) kill -9 $PID echo ">>> Fichiers de parametres générés."
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
1
25 sept. 2007 à 14:56
25 sept. 2007 à 14:56
Merci Dubcek !
Visiblement cette solution fonctionne, j'ai simplement ajouté l'option "-e" après le echo dans
Sans abuser de ta patience Dubcek j'ai encore une petite question :
A la fin de l'exécution du script j'ai la confirmation du kill -9 $PID :
Comment pourrais-je faire pour que cela ne s'affiche pas ? (si cela est possible...)
D'avance merci
Visiblement cette solution fonctionne, j'ai simplement ajouté l'option "-e" après le echo dans
echo ".\c"comme l'avait suggéré jipicy
Sans abuser de ta patience Dubcek j'ai encore une petite question :
A la fin de l'exécution du script j'ai la confirmation du kill -9 $PID :
[toto@localhost PARAM]$ ./toto.sh >>> Préparation des fichiers de parametres en cours . . . . . . . . . . . . ./toto.sh: line 45: 15030 Killed while true; do sleep 1; echo -e ".\c"; done >>> Fichers de parametres générés [toto@localhost PARAM]$
Comment pourrais-je faire pour que cela ne s'affiche pas ? (si cela est possible...)
D'avance merci
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
25 sept. 2007 à 15:10
25 sept. 2007 à 15:10
j'avais mis le -e ?. Comme ça, il devrait être silencieux : kill -9 $PID > /dev/null 2>&1
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
1
25 sept. 2007 à 15:21
25 sept. 2007 à 15:21
le "-e" c'est moi qui l'ai rajouté de façon à ce que les points s'affichent sur une même ligne et non un par ligne (merci jipicy :) )
La commande kill -9 $PID > /dev/null 2>&1 ne fonctionne pas de mon côté :(
Toutefois pourrais-tu m'expliquer brièvement ce que fais cette commande (après le "$PID") stp ?
et du coup, aurais-tu une autre idée...?
Merci
La commande kill -9 $PID > /dev/null 2>&1 ne fonctionne pas de mon côté :(
Toutefois pourrais-tu m'expliquer brièvement ce que fais cette commande (après le "$PID") stp ?
et du coup, aurais-tu une autre idée...?
Merci
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
25 sept. 2007 à 15:39
25 sept. 2007 à 15:39
le \c élimine le saut de ligne et le -e autorise l'interpretation des \x
kill -9 $PID > /dev/null 2>&1 : envoie le standard output dans /dev/null donc le detruit et envoie les erreurs au même endrot
essayons ça avec un fichier pour déclancher l'arrêt :
#!/bin/sh
echo ">>> Préparation des fichiers de parametres en cours "
rm -f ABORT ; while [ ! -f ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
grep -v "motif" FIC01 FIC02 | sed "s/motif1/motif2/g" | sort -u > FIC03
perl fichier.pl FIC03 > FIC04
etc... (<autres commandes dans le même genre>)
touch ABORT
echo ">>> Fichiers de parametres générés."
kill -9 $PID > /dev/null 2>&1 : envoie le standard output dans /dev/null donc le detruit et envoie les erreurs au même endrot
essayons ça avec un fichier pour déclancher l'arrêt :
#!/bin/sh
echo ">>> Préparation des fichiers de parametres en cours "
rm -f ABORT ; while [ ! -f ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
grep -v "motif" FIC01 FIC02 | sed "s/motif1/motif2/g" | sort -u > FIC03
perl fichier.pl FIC03 > FIC04
etc... (<autres commandes dans le même genre>)
touch ABORT
echo ">>> Fichiers de parametres générés."
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
1
25 sept. 2007 à 15:50
25 sept. 2007 à 15:50
Merci Dubcek ,
Ca fonctionne presque , j'ai ceci qui s'affiche :
Je pensais que tout était OK mais.....
J'ai l'affichage des points qui continue :
et je suis obligé de "killer" la console car il ne s'arrête plus :(
Vois tu d'où ça vient..?
Ca fonctionne presque , j'ai ceci qui s'affiche :
[toto@localhost PARAM]$ ./toto.sh >>> Préparation des fichiers de parametres en cours . . . . . . . . . . . . >>> Fichers de parametres générés [toto@localhost PARAM]$
Je pensais que tout était OK mais.....
J'ai l'affichage des points qui continue :
[toto@localhost PARAM]$ ./toto.sh >>> Préparation des fichiers de parametres en cours . . . . . . . . . . . . >>> Fichers de parametres générés [toto@localhost PARAM]$ . . . . . . . . . .
et je suis obligé de "killer" la console car il ne s'arrête plus :(
Vois tu d'où ça vient..?
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
25 sept. 2007 à 16:05
25 sept. 2007 à 16:05
est ce que entre
rm -f ABORT ; while [ ! -f ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
et
touch ABORT
il y a un changement de répertoire (cd) ?
essayer ca :
rm -f /tmp/ABORT ; while [ ! -f /tmp/ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
...
touch /tmp/ABORT
rm -f ABORT ; while [ ! -f ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
et
touch ABORT
il y a un changement de répertoire (cd) ?
essayer ca :
rm -f /tmp/ABORT ; while [ ! -f /tmp/ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
...
touch /tmp/ABORT
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
1
25 sept. 2007 à 16:13
25 sept. 2007 à 16:13
non ça fonctionne ! Au temps pour moi..
J'avais copié/collé la solution de tout a l'heure sauf le "touch ABORT" que j'avais rajouté a la main vu qu'il prend place plus loin dans me code et j'avais fait une faute de frappe (j'avais mis ARBORT) du coup il n'était jamais créé, et la condition restait toujours vraie... voilà tout
Donc un GRAND merci Dubcek pour ton aide et ta patience !
A bientot!
J'avais copié/collé la solution de tout a l'heure sauf le "touch ABORT" que j'avais rajouté a la main vu qu'il prend place plus loin dans me code et j'avais fait une faute de frappe (j'avais mis ARBORT) du coup il n'était jamais créé, et la condition restait toujours vraie... voilà tout
Donc un GRAND merci Dubcek pour ton aide et ta patience !
A bientot!
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
25 sept. 2007 à 16:18
25 sept. 2007 à 16:18
ce fut un plaisir ...
soyons puristes. Il va y avoir un problème si ce script tourne plusieurs fois en parallèle à cause du nom du fichier ABORT.
il faudrait lui donner un nom unique, par ex. ABORT$$
ou $$ est le numéro du processus
soyons puristes. Il va y avoir un problème si ce script tourne plusieurs fois en parallèle à cause du nom du fichier ABORT.
il faudrait lui donner un nom unique, par ex. ABORT$$
ou $$ est le numéro du processus
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
1
25 sept. 2007 à 19:46
25 sept. 2007 à 19:46
Désolé je n'étais plus devant ma machine,
OK mais comment faire pour numéroter le fichier avec le numéro de processus ..?
Sinon j'ai inversé la méthode en effectuant les commandes tant que le fichier existe, et en le supprimant à la fin,
ce qui donne :
Qu'en dis-tu ? Il me semble que ça permet de ne plus avoir de traces de l'"astuce"
OK mais comment faire pour numéroter le fichier avec le numéro de processus ..?
Sinon j'ai inversé la méthode en effectuant les commandes tant que le fichier existe, et en le supprimant à la fin,
ce qui donne :
#!/bin/sh echo ">>> Préparation des fichiers de parametres en cours " touch ABORT ; while [ -f ABORT ] ; do sleep 1 ; echo -e ".\c" ; done & cat FIC01 FIC02 | grep -v "motif" | sed "s/motif1/motif2/g" | sort -u > FIC03 perl fichier.pl FIC03 > FIC04 etc... (<autres commandes dans le même genre>) rm -f ABORT echo ">>> Fichiers de parametres générés."
Qu'en dis-tu ? Il me semble que ça permet de ne plus avoir de traces de l'"astuce"
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
25 sept. 2007 à 20:07
25 sept. 2007 à 20:07
Re-
OK mais comment faire pour numéroter le fichier avec le numéro de processus ..?
OK mais comment faire pour numéroter le fichier avec le numéro de processus ..?
#!/bin/sh echo ">>> Préparation des fichiers de parametres en cours " touch ABORT$$ ; while [ -f ABORT$$ ] ; do sleep 1 ; echo -e ".\c" ; done & cat FIC01 FIC02 | grep -v "motif" | sed "s/motif1/motif2/g" | sort -u > FIC03 perl fichier.pl FIC03 > FIC04 etc... (<autres commandes dans le même genre>) rm -f ABORT$$ echo ">>> Fichiers de parametres générés.";-))
F_Pignon
Messages postés
23
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
29 mai 2008
1
27 sept. 2007 à 14:57
27 sept. 2007 à 14:57
Bonjour jipicy,
Désolé pour ma réponse tardive mais MERCI
:)
Récapitulatif de la solution à mon pb :
Désolé pour ma réponse tardive mais MERCI
:)
Récapitulatif de la solution à mon pb :
#!/bin/sh echo ">>> Préparation des fichiers de parametres en cours " touch ABORT$$ ; while [ -f ABORT$$ ] ; do sleep 1 ; echo -e ".\c" ; done & <DIVERSES COMMANDES> rm -f ABORT$$ echo ">>> Fichiers de parametres générés."