Rechercher : dans
Par :

[Script Unix][NR] Pb boucle while en ksh

Dernière réponse le 22 oct 2008 à 16:11:04 rhrl7730, le 22 oct 2008 à 14:10:20 
 Signaler ce message aux modérateurs

Bonjour,

j'ai un probleme pour recupérer la valeur d'une variable en ksh : WTMP2

en gros, je fais un last que j'envoi dans une boucle.
pour chaque ligne du last, si ma condition est vérifiée, j'incremente la variable WTMP2 que j'exploite dans la suite de mon script

Comme on le voit dans l'exemple ci dessous, la valeur est parfaitement incrémentée à l'interieur du while. Par contre, des que l'on sort.....la variable reprend sa valeur initiale, 0.

C'est comme si la boucle partait dans un processus fils completement independant...

Une explication ?

merci pour vos retours.

Seb

#####################################
FIC=$1
VAR=$2
WTMP2=0
JOURS=`date +%_d`
last -f $FIC | grep -i $VAR | grep pts | grep -v wtmp | while read line
do
if [ `echo $line | awk '{ print $6 }'` -le $JOURS ]; then
(( WTMP2=$WTMP2+1 ))
fi
done
echo "${WTMP2}"
####################################



+ 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

Configuration: Windows XP
Firefox 1.5.0.1

Meilleures réponses pour « [Script Unix][NR] Pb boucle while en ksh » dans :
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Envoi de commandes CISCO publipostées via SSH/Telnet VoirExpect en action Informations générales publipmachin point cheu ? Mais c'est quoi au juste ? Le contenu des fichiers annexes commandes.txt liste.txt THE Script Commentaires Remerciements Questions / Report de Bugs / Modifications
Javascript - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle' On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non, ce qui permet notamment de donner de l'interactivité à vos scripts : Instruction...
VBScript - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (VBScript associe le mot clé true à...

1

jipicy, le 22 oct 2008 à 14:21:19
  • +1

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 :

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...
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

2

rhrl7730, le 22 oct 2008 à 14:32:33

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

Répondre à rhrl7730

3

jipicy, le 22 oct 2008 à 14:38:58

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 ;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

4

rhrl7730, le 22 oct 2008 à 15:03:16

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

Répondre à rhrl7730

5

jipicy, le 22 oct 2008 à 15:15:05

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 ;-\
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

6

rhrl7730, le 22 oct 2008 à 15:30:05

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

Répondre à rhrl7730

7

jipicy, le 22 oct 2008 à 15:54:50

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 :

#! /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 ;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

8

 rhrl7730, le 22 oct 2008 à 16:11:04

Ok, je vais tester,

merci pour tes réponses rapides !

Répondre à rhrl7730