Pb avec boucle while

Résolu/Fermé
sebphilip Messages postés 4 Date d'inscription mercredi 29 février 2012 Statut Membre Dernière intervention 22 mars 2012 - 22 mars 2012 à 21:01
 Utilisateur anonyme - 23 mars 2012 à 22:06
Bonjour, avec un script cash, je souhaite récupérer des infos dans ma base de donnée et les afficher les uns apres les autres ( et faire d'autre action).

J'utilise donc une boucle while. Mon problème c'est que la boucle fonctionne bien, par contre quand j'obtiens ma condition d'arrêt de boucle, elle continue quand meme...

Pouvez vous me dire ou est mon problème?

Ma condition: quand numéro de portable est vide, je sors de la boucle.
Merci

#!/bin/bash

while [ "$numeroportable"="" ]

do

requete=$(mysql -h adresseip -u utilisateur -pMDP -B --exec="connect BDD;SELECT numeroportable,name FROM TABLE WHERE bienvenue='0'")

echo $requete

numeroportable='echo $requete |cut -d" " -f3'
nom='echo $requete |cut -d" " -f4'

echo $numeroportable
echo $nom

echo 'message envoyé'

miseajour=$(mysql -h adresseip -u utilisateur -pMDP -B --exec="connect BDD;UPDATE TABLE SET bienvenue='1' WHERE name='$nom'")

done

echo 'rien a faire'




4 réponses

_Tawal_ Messages postés 644 Date d'inscription jeudi 23 février 2012 Statut Membre Dernière intervention 7 juillet 2012 73
Modifié par _Tawal_ le 22/03/2012 à 21:39
Bonjour,

Essaie avec cette condition :
while [ ! -z $numeroportable ]


En gros ça veut dire : Tant que $numerodeportable n'est pas vide fait .....
0
Utilisateur anonyme
22 mars 2012 à 22:28
salut,

en fait, c'est le contraire que veut sebphilip :
tant que num est vide
while [ -z "$num" ]; do

autrement dit
jusqu'à ce que num ait un valeur
until [ -n "$num" ]; do
0
_Tawal_ Messages postés 644 Date d'inscription jeudi 23 février 2012 Statut Membre Dernière intervention 7 juillet 2012 73
23 mars 2012 à 11:27
Ah moi j'avais compris le contraire !

Ma condition: quand numéro de portable est vide, je sors de la boucle.
C'est ce qu'il dit.
Il sort de la boucle quand $numerpprtable est vide.
0
Utilisateur anonyme
23 mars 2012 à 12:37
mouais, c'est pas clair :( son code (incorrect) exprime le contraire de sa description.
sebphilip ? un commentaire ?
0
Effectivement, je veux dire: Quand num protable est vide, je sors de la boucle.

Merci pour votre aide.
0
Utilisateur anonyme
23 mars 2012 à 13:43
ok, alors tu inverses -n et -z dans ma proposition.

mais ça ne permettra plus d'entrer dans la boucle, puisque la variable n'est pas définie par défaut.

tu devrais revoir ton algorithme, il ne paraît pas correct.
la requête SQL devrais
- ne sortir que les enregistrements pour lesquels le numportable est renseigné _et_ bienvenue vaut 0
- être redirigée vers une boucle while pour envoyer les messages et construire une variable qui servira, en sortant de la boucle, à effectuer la mise à jour de la BDD.

Il faut encore peaufiner...
0
_Tawal_ Messages postés 644 Date d'inscription jeudi 23 février 2012 Statut Membre Dernière intervention 7 juillet 2012 73
23 mars 2012 à 14:07
Il suffit d'initialiser la variable $numeroportable au début du script à une valeur "bâtarde".
Et le script rentrera dans la boucle.
Cette valeur bâtarde n'occasionnera pas d'erreurs puisque tu affecte une valeur dans la boucle avant d'utiliser cette variable.
0
_Tawal_ Messages postés 644 Date d'inscription jeudi 23 février 2012 Statut Membre Dernière intervention 7 juillet 2012 73
23 mars 2012 à 20:17
Bon je crois savoir pourquoi :
il faut tester la variable $numeroportable et "break" la boucle avant qu'elle recommence !

en gros ça donne ça :
#!/bin/bash

while [ ! -z $numeroportable ]

do

requete=$(mysql -h adresseip -u utilisateur -pMDP -B --exec="connect BDD;SELECT numeroportable,name FROM TABLE WHERE bienvenue='0'")

echo $requete

numeroportable='echo $requete |cut -d" " -f3'
nom='echo $requete |cut -d" " -f4'

if [ -z $numeroportable ] then 
   break
fi

echo $numeroportable
echo $nom

echo 'message envoyé'

miseajour=$(mysql -h adresseip -u utilisateur -pMDP -B --exec="connect BDD;UPDATE TABLE SET bienvenue='1' WHERE name='$nom'")

done

echo 'rien a faire'


Mais c'est brutal !
0
_Tawal_ Messages postés 644 Date d'inscription jeudi 23 février 2012 Statut Membre Dernière intervention 7 juillet 2012 73
23 mars 2012 à 20:19
Mais du coup la condition de la boucle while ne sert à rien !
0
Ca marche!!!!

Merci mille fois.

Meme si c'est pas beau comme script. Ca me débloque pour la suite.
:))))
0
_Tawal_ Messages postés 644 Date d'inscription jeudi 23 février 2012 Statut Membre Dernière intervention 7 juillet 2012 73
23 mars 2012 à 21:24
Tu as fait quoi pour régler le problème du fi unexpected ?
0
_Tawal_ Messages postés 644 Date d'inscription jeudi 23 février 2012 Statut Membre Dernière intervention 7 juillet 2012 73
23 mars 2012 à 21:37
Zut le point virgule après la condition ! Mea culpa !
0
Utilisateur anonyme
23 mars 2012 à 22:06
Je voyais plutôt quelquechose comme ça
#!/bin/bash

while read numportable name
do [ -n "$noms" ] && noms="$noms OR name='$name'" || noms="name='$name'"
   echo "exécution envoi d'un message à $name, vers $numportable"
done < <(mysql -h adresseip -u utilisateur -pMDP -B --exec="connect BDD;SELECT numeroportable,name FROM TABLE WHERE bienvenue='0'")
mysql -h adresseip -u utilisateur -pMDP -B --exec="connect BDD;UPDATE TABLE SET bienvenue='1' WHERE $nom"

mes souvenirs de mysql ne sont plus très frais, et je n'ai pas de base données pour tester. Le but est d'avoir le moins de connexions possible (ici, idéalement, deux).
0