Test avec boucle "until"
Résolu
jivef
Messages postés
927
Date d'inscription
Statut
Membre
Dernière intervention
-
jivef Messages postés 927 Date d'inscription Statut Membre Dernière intervention -
jivef Messages postés 927 Date d'inscription Statut Membre Dernière intervention -
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).
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.
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:
- Test avec boucle "until"
- Test performance pc - Guide
- Test disque dur - Télécharger - Informations & Diagnostic
- Test steam deck oled - Guide
- Test composant pc - Guide
- Test batterie pc - Guide
2 réponses
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 à :
;-((
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]
;-((
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.
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.
Happy for you et merci du retour ;-)
Avec de simples crochets il est préférable de quoter les variables ;-\
;-))