Pb avec boucle while
Résolu
sebphilip
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
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
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'
A voir également:
- Pb avec boucle while
- Xiaomi s'éteint tout seul et se rallume en boucle - Forum Xiaomi
- Boucle excel sans macro - Forum Excel
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Vlc lire en boucle ✓ - Forum Lecteurs et supports vidéo
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
4 réponses
Bonjour,
Essaie avec cette condition :
En gros ça veut dire : Tant que $numerodeportable n'est pas vide fait .....
Essaie avec cette condition :
while [ ! -z $numeroportable ]
En gros ça veut dire : Tant que $numerodeportable n'est pas vide fait .....
salut,
en fait, c'est le contraire que veut sebphilip :
tant que num est vide
autrement dit
jusqu'à ce que num ait un valeur
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
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...
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...
Bon je crois savoir pourquoi :
il faut tester la variable $numeroportable et "break" la boucle avant qu'elle recommence !
en gros ça donne ça :
Mais c'est brutal !
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 !
Je voyais plutôt quelquechose comme ça
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).
#!/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).