Pb avec boucle while

Résolu
sebphilip Messages postés 4 Statut Membre -  
 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

  1. _Tawal_ Messages postés 672 Statut Membre 73
     
    Bonjour,

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


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

      Merci pour votre aide.
      0
    4. 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
    5. _Tawal_ Messages postés 672 Statut Membre 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
  3. _Tawal_ Messages postés 672 Statut Membre 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
    1. _Tawal_ Messages postés 672 Statut Membre 73
       
      Mais du coup la condition de la boucle while ne sert à rien !
      0
    2. sebphilip
       
      Ca marche!!!!

      Merci mille fois.

      Meme si c'est pas beau comme script. Ca me débloque pour la suite.
      :))))
      0
    3. _Tawal_ Messages postés 672 Statut Membre 73
       
      Tu as fait quoi pour régler le problème du fi unexpected ?
      0
    4. _Tawal_ Messages postés 672 Statut Membre 73
       
      Zut le point virgule après la condition ! Mea culpa !
      0
  4. 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