Test avec boucle "until"

Résolu/Fermé
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 - Modifié par jivef le 1/07/2010 à 04:56
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 - 1 juil. 2010 à 20:25
Bonjour à tous,

J'ai un petit problème avec un script shell, et je n'arrive pas à trouver quel est le bug.
Certes ce n'est pas du grand oeuvre, j'ai fait quelque chose de simple et de compréhensible. (J'ai peut-être même un peu forcé sur les commentaires.)

Pour l'instant, ce script est en cours de construction, donc certains morceaux inutiles seront retirés à terme.
Ce qui me pose problème, c'est juste le "test" conditionnement l'entrée dans la boucle "until." Je n'arrive pas à comprendre l'erreur.

Voici le script (j'ai retiré les parties inutiles).

#!/bin/sh  
[...  commentaires et definition de variables retirées car non nécessaires pour expliquer le probleme.]  

#creation et initialisation variable count (compteur incrementiel)  
COUNT=0  
ENDCOUNT=2  
# PUBIP est la variable qui contiendra l'adresse IP publique du site.  
PUBIP=""  
###############################################################################################################################  
# bloc d'instruction visant a recuperer l'adresse IP Publique du site.  
# Tente jusqu'a ce qu'une des deux conditions soit remplie : soit $COUNT=2 (compteur incremente a chaque passage) soit $PUBIP n'est pas nul.  
# Tant qu'une condition n'est pas remplie, il tente une recuperation d'IP avec www.whatip.com, puis, si $PUBIP est toujours vide, alors il tente une   
# recuperation d'IP avec www.monip.org  
# Une fois qu'une des deux condition est remplie, il sort de la boucle.  
until [ -n $PUBIP -o $COUNT=$ENDCOUNT ]  
    do   
    PUBIP='wget http://www.whatip.com.bad  ; grep -i "your IP: " index.html | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"'   # retirer .bad pour reactiver.  
    echo "$PUBIP par whatip"   
    sleep 3  
    if [ -z $PUBIP]  
        then   
        PUBIP='wget http://www.monip.org.bad ; grep -i "IP : " index.html | grep -o " [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"'         # retirer .bad pour reactiver.  
       echo "$PUBIP par monip"  
    else  
        break  
        echo "CONTROLE : texte ne devant jamais etre affiche."       
    fi  
    let COUNT=$COUNT+1   
    echo "le compteur est a $COUNT"  
    echo " La variable de l'adresse IP contient : $PUBIP "  
    sleep 2  
    done  
#Fin du bloc d'instruction et de la boucle visant a recupere l'adresse IP publique.  
###############################################################################################################################   


Ensuite, j'ai mis des instructions visant à envoyer l'IP a un administrateur, mais cette deuxième partie fonctionne correctement.

Ce qui me gêne ici, c'est le fonctionnement du test dans la boucle until.

Je voulais lui demander de s'arrêter lorsqu'une des deux conditions est remplie, mais apparemment ma question est mal posée.

Lorsque "$PUBIP" contient quelque chose, il s'arrête, mais lorsque $PUBIP est égal à rien et que $COUNT dépasse allègrement 2, il continue en boucle infinie, alors qu'une des deux conditions devraient arrêter le job.

J'ai tenté d'inverser avec while (et forcément des tests différents ) au lieu de until, mais c'est le même délire.
Il y a un os dans mon test, mais je ne le vois pas.

Est-ce que quelqu'un a une idée.
Merci par avance, et par Toutatis.

Jonas.





Une idée reçue est souvent une idée morte.
A voir également:

2 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
1 juil. 2010 à 07:38
Salut,

Pas trop le temps de m'y pencher là (mais ceci dit, j'ai toujours préféré une boucle "while" à une boucle "until" ;-( ), mais si c'est un copier/coller de ton script original, il manque un espace avant le crochet fermant à :

 if [ -z $PUBIP] 

;-((
0
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
Modifié par jivef le 1/07/2010 à 09:18
Bonjour,
bien vu pour l'espace, mais en fait, c'est bien le test du dessus qui foire.
En fait, il y a deux tests reliés par un OU logique (le -o)
Et c'est là qu'il y a un problème car chaque test pris séparément fonctionne, mais j'ai besoin de les cumuler pour que la même boucle soit capable de traiter les deux conditions.

Pour traiter une condition, pas de problème, même avec while au lieu de until.
ENDCOUNT=5
COUNT=0
PUBIP=""
mobitux:/home/jonas# while [ $COUNT -lt $ENDCOUNT ]; do echo $COUNT; let COUNT=$COUNT+1; done
0
1
2
3
4

idem avec until :
mobitux:/home/jonas# until [ $COUNT -eq $ENDCOUNT ]; do echo $COUNT; let COUNT=$COUNT+1;done
0
1
2
3
4

Mais dès que j'ai deux conditions, ça foire un petit peu.



En tout merci pour ta réponse.
Je vais tout de même refaire un essai.

A plus tard.
0
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
Modifié par jivef le 1/07/2010 à 09:33
Je l'ai refait avec deux conditions.

mobitux:/home/jonas# PUBIP=""
mobitux:/home/jonas# COUNT=0
mobitux:/home/jonas# until [ $COUNT -eq $ENDCOUNT -o -n $PUBIP ]; do echo $COUNT; let COUNT=$COUNT+1;done

Le temps que je fasse CTRL-C j'en étais à
21207
bash: [: argument expected
21208
bash: [: argument expected
21209
bash: [: argument expected
21210


Par contre, si je met quelque chose dans PUBIP, le résultat n'est plus le même :
mobitux:/home/jonas# PUBIP=0
mobitux:/home/jonas# COUNT=0
mobitux:/home/jonas# until [ $COUNT -eq $ENDCOUNT -o -n $PUBIP ]; do echo $COUNT; let COUNT=$COUNT+1;done
mobitux:/home/jonas#

Le script s'arrête aussitôt car une des deux condition est réunie.
(avec un OU Logique)

Jipicy, j'avais besoin d'en parler à quelqu'un, même si tu ne m'écoutais pas...
En tout cas j'ai trouvé...
La prochaine fois, plutôt que de perdre du temps, je ferai un algorythme.
mobitux:/home/jonas# until [ $COUNT -eq $ENDCOUNT -o -z $PUBIP ]; do echo $COUNT; let COUNT=$COUNT+1;done
0
1
2
3
4
mobitux:/home/jonas#

Là, ça a marché.
Je savais bien que c'était le test qui n'était pas bon, la preuve.

A bientôt.
Je vais passer en résolu.
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
1 juil. 2010 à 09:37
Les meilleures résolutions sont celles dont on en vient à bout tout seul ;-))

Happy for you et merci du retour ;-)
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
1 juil. 2010 à 10:09
Juste un truc...

Avec de simples crochets il est préférable de quoter les variables ;-\

jp@MDK:~/tmpfs ssh$ A="";B="1";if [ $B = 1 -o -n $A ];then echo vide;fi
-bash: [: argument expected

jp@MDK:~/tmpfs ssh$ A="";B="1";if [ "$B" = "1" -o -n "$A" ];then echo vide;fi
vide
jp@MDK:~/tmpfs ssh$

;-))
0
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
1 juil. 2010 à 20:25
Merci pour le truc.
En effet, j'ai déjà vu ça dans des bouquins. (pour quoter les variables.)
C'est bien compris, je vais rectifier.

Tu vois, je progresse !
Je ne suis pas encore aussi calé que toi, mais j'avance.

A bientôt.
Jonas.
0