[Script Unix][NR] Pb boucle while en ksh
Résolu/Fermé
rhrl7730
Messages postés
5
Date d'inscription
mercredi 22 octobre 2008
Statut
Membre
Dernière intervention
22 octobre 2008
-
22 oct. 2008 à 14:10
rhrl7730 Messages postés 5 Date d'inscription mercredi 22 octobre 2008 Statut Membre Dernière intervention 22 octobre 2008 - 22 oct. 2008 à 16:11
rhrl7730 Messages postés 5 Date d'inscription mercredi 22 octobre 2008 Statut Membre Dernière intervention 22 octobre 2008 - 22 oct. 2008 à 16:11
A voir également:
- [Script Unix][NR] Pb boucle while en ksh
- Script vidéo youtube - Guide
- Microsoft activation script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Ipconfig unix ✓ - Forum Linux / Unix
- Script les visiteurs pdf - Forum Cinéma / Télé
7 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
22 oct. 2008 à 14:21
22 oct. 2008 à 14:21
Salut,
Comme on le voit dans l'exemple ci dessous, la valeur est parfaitement incrémentée à l'interieur du while.
Euh...non, là on voit rien, c'est pas le script qui fait l'incrémentation, si ?
Rajoute :
Comme on le voit dans l'exemple ci dessous, la valeur est parfaitement incrémentée à l'interieur du while.
Euh...non, là on voit rien, c'est pas le script qui fait l'incrémentation, si ?
Rajoute :
do if [ `echo $line | awk '{ print $6 }'` -le $JOURS ]; then (( WTMP2=$WTMP2+1 )) echo "valeur boucle : $WTMP2 fi done echo "valeur : ${WTMP2}"et là on verra peut être...
rhrl7730
Messages postés
5
Date d'inscription
mercredi 22 octobre 2008
Statut
Membre
Dernière intervention
22 octobre 2008
22 oct. 2008 à 14:32
22 oct. 2008 à 14:32
On obtient ce qui est présenté à la fin de mon premier post : on voit bien la valeur s'incrémenter dans la boucle while ( valeur boucle : <valeur> )
puis, après la sortie de boucle, 0 !!
+ Wtmp2Cpt /var/log/wtmp.1 Sep
valeur boucle : 1
valeur boucle : 2
valeur boucle : 3
valeur boucle : 4
valeur boucle : 5
valeur boucle : 6
valeur boucle : 7
valeur boucle : 8
valeur boucle : 9
valeur boucle : 10
valeur boucle : 11
valeur : 0
puis, après la sortie de boucle, 0 !!
+ Wtmp2Cpt /var/log/wtmp.1 Sep
valeur boucle : 1
valeur boucle : 2
valeur boucle : 3
valeur boucle : 4
valeur boucle : 5
valeur boucle : 6
valeur boucle : 7
valeur boucle : 8
valeur boucle : 9
valeur boucle : 10
valeur boucle : 11
valeur : 0
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
22 oct. 2008 à 14:38
22 oct. 2008 à 14:38
Oui ça je l'avais compris, mais je ne vois pas où dans ton script il est fait mention d'un :
echo "valeur boucle : $WTMP2"
On peut voir la sortie de :
last -f $FIC | grep -i $VAR | grep pts | grep -v wtmp
s'il te plaît, merci ;-))
echo "valeur boucle : $WTMP2"
On peut voir la sortie de :
last -f $FIC | grep -i $VAR | grep pts | grep -v wtmp
s'il te plaît, merci ;-))
rhrl7730
Messages postés
5
Date d'inscription
mercredi 22 octobre 2008
Statut
Membre
Dernière intervention
22 octobre 2008
22 oct. 2008 à 15:03
22 oct. 2008 à 15:03
effectivement, j'ai posté une version simplifiée du script. J'ai dégagé les echo "valeur boucle : $WTMP2" pour que ce soit plus lisible.
c'est pour cela que tu ne les vois pas.
Pour la sortie de la commande last la voici :
root pts/1 IP Tue Sep 30 18:17 gone - no logout
root pts/0 IP Tue Sep 30 18:16 gone - no logout
root pts/0 IP Tue Sep 30 18:16 - 18:16 (00:00)
root pts/0 IP Mon Sep 29 11:21 - 18:16 (1+06:55)
root pts/1 IP Wed Sep 24 19:03 - 18:15 (23:12)
root pts/0 IP Mon Sep 22 11:44 - 18:12 (4+06:27)
root pts/1 IP Fri Sep 19 17:36 - 18:55 (01:19)
root pts/0 IP Mon Sep 15 11:08 - 17:57 (2+06:48)
root pts/0 IP Fri Sep 12 16:12 - 18:27 (02:14)
root pts/0 IP Fri Sep 12 11:27 - 14:44 (03:17)
root pts/0 IP Wed Sep 10 16:31 - 11:20 (1+18:49)
root pts/0 IP Mon Sep 8 16:44 - 15:55 (1+23:11)
root pts/2 IP Fri Sep 5 13:44 - 18:31 (04:46)
root pts/1 IP Fri Sep 5 13:23 - 18:32 (05:08)
root pts/0 IP Wed Sep 3 13:58 - 18:32 (2+04:33)
root pts/0 IP Tue Sep 2 10:57 - 11:06 (00:08)
chacune des lignes est envoyée dans la boucle while.
Seb
c'est pour cela que tu ne les vois pas.
Pour la sortie de la commande last la voici :
root pts/1 IP Tue Sep 30 18:17 gone - no logout
root pts/0 IP Tue Sep 30 18:16 gone - no logout
root pts/0 IP Tue Sep 30 18:16 - 18:16 (00:00)
root pts/0 IP Mon Sep 29 11:21 - 18:16 (1+06:55)
root pts/1 IP Wed Sep 24 19:03 - 18:15 (23:12)
root pts/0 IP Mon Sep 22 11:44 - 18:12 (4+06:27)
root pts/1 IP Fri Sep 19 17:36 - 18:55 (01:19)
root pts/0 IP Mon Sep 15 11:08 - 17:57 (2+06:48)
root pts/0 IP Fri Sep 12 16:12 - 18:27 (02:14)
root pts/0 IP Fri Sep 12 11:27 - 14:44 (03:17)
root pts/0 IP Wed Sep 10 16:31 - 11:20 (1+18:49)
root pts/0 IP Mon Sep 8 16:44 - 15:55 (1+23:11)
root pts/2 IP Fri Sep 5 13:44 - 18:31 (04:46)
root pts/1 IP Fri Sep 5 13:23 - 18:32 (05:08)
root pts/0 IP Wed Sep 3 13:58 - 18:32 (2+04:33)
root pts/0 IP Tue Sep 2 10:57 - 11:06 (00:08)
chacune des lignes est envoyée dans la boucle while.
Seb
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
22 oct. 2008 à 15:15
22 oct. 2008 à 15:15
En me basant sur ton script et avec un fichier "fich" contenant le résultat de la commande "last -f ...", voilà ce que j'obtiens chez moi :
[tmpfs]$ cat foo.ksh #! /bin/ksh WTMP2=0 JOURS=$(date +%_d) while read line do if [ $(echo $line | awk '{ print $6 }') -le $JOURS ]; then echo "Valeur boucle $WTMP2" (( WTMP2=$WTMP2+1 )) fi done < fich echo "Valeur finale boucle : ${WTMP2}" [tmpfs]$ ./foo.ksh Valeur boucle 0 Valeur boucle 1 Valeur boucle 2 Valeur boucle 3 Valeur boucle 4 Valeur boucle 5 Valeur boucle 6 Valeur boucle 7 Valeur boucle 8 Valeur boucle 9 Valeur boucle 10 Valeur finale boucle : 11 [tmpfs]$Bizarre que ça ne marche pas chez toi ;-\
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
rhrl7730
Messages postés
5
Date d'inscription
mercredi 22 octobre 2008
Statut
Membre
Dernière intervention
22 octobre 2008
22 oct. 2008 à 15:30
22 oct. 2008 à 15:30
Effectivement, c'est de cette manière que j'ai modifié mon script : je renvoi le resultat de la commande last dans un fichier que j'exploite par la suite, comme toi.
ce que je souhaite savoir c'est quelle est la différence entre ces deux manières de faire, car dans un cas la boucle semble rester "attaché" au processus tandis que dans le deuxieme, la boucle while semble creer un second processus independant, dans lequel je ne peux donc pas exploiter de variables lorsqu'il se termine au moment du 'done'
--------------------------------
<commande> > fic
while read line
do
bla bla
done < fic
--------------------------------
ET
--------------------------------------------
<commande> | while read line
do
bla bla
done
--------------------------------------------
Seb
ce que je souhaite savoir c'est quelle est la différence entre ces deux manières de faire, car dans un cas la boucle semble rester "attaché" au processus tandis que dans le deuxieme, la boucle while semble creer un second processus independant, dans lequel je ne peux donc pas exploiter de variables lorsqu'il se termine au moment du 'done'
--------------------------------
<commande> > fic
while read line
do
bla bla
done < fic
--------------------------------
ET
--------------------------------------------
<commande> | while read line
do
bla bla
done
--------------------------------------------
Seb
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
22 oct. 2008 à 15:54
22 oct. 2008 à 15:54
Effectivement, dans la 2nde forme, chaque commande est lancée dans un processus fils et de ce fait la dernière commande "echo $WTMP2" est héritée du shell père (celui qui a initialisé la variable) et non de celui qui a lu les lignes (while read).
Pour ce faire il faut écrire le script de cette façon :
Pour ce faire il faut écrire le script de cette façon :
#! /bin/ksh #set -xv WTMP2=0 JOURS=$(date +%_d) cat fich | (while read line do if [ $(echo $line | awk '{ print $6 }') -le $JOURS ]; then echo "Valeur boucle $WTMP2" (( WTMP2=$WTMP2+1 )) fi done echo "Valeur finale boucle : ${WTMP2}") [tmpfs]$et là ça marche ;-))
rhrl7730
Messages postés
5
Date d'inscription
mercredi 22 octobre 2008
Statut
Membre
Dernière intervention
22 octobre 2008
22 oct. 2008 à 16:11
22 oct. 2008 à 16:11
Ok, je vais tester,
merci pour tes réponses rapides !
merci pour tes réponses rapides !