Pb avec boucle while

Résolu
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. Bonjour,

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


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

        Merci pour votre aide.
        0
      4. 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. 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
    2. 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. Mais du coup la condition de la boucle while ne sert à rien !
        0
      2. Ca marche!!!!

        Merci mille fois.

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