Pb avec boucle while

Résolu
sebphilip Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
 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

#!/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   Statut Membre Dernière intervention   73
 
Bonjour,

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


En gros ça veut dire : Tant que $numerodeportable n'est pas vide fait .....
0
Utilisateur anonyme
 
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   Statut Membre Dernière intervention   73
 
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
 
mouais, c'est pas clair :( son code (incorrect) exprime le contraire de sa description.
sebphilip ? un commentaire ?
0
sebphilip
 
Effectivement, je veux dire: Quand num protable est vide, je sors de la boucle.

Merci pour votre aide.
0
Utilisateur anonyme
 
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   Statut Membre Dernière intervention   73
 
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   Statut Membre Dernière intervention   73
 
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   Statut Membre Dernière intervention   73
 
Mais du coup la condition de la boucle while ne sert à rien !
0
sebphilip
 
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   Statut Membre Dernière intervention   73
 
Tu as fait quoi pour régler le problème du fi unexpected ?
0
_Tawal_ Messages postés 644 Date d'inscription   Statut Membre Dernière intervention   73
 
Zut le point virgule après la condition ! Mea culpa !
0
Utilisateur anonyme
 
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