Mechante boucle while infinie

kira -  
loftyramitsu Messages postés 43 Statut Membre -
Bonjour,

Je vous écris car je suis en détresse : un pauvre petit script en bash m'a battu..
Je m'explique : je souhaite juste tester si un nombre entré est égal à 1 ou 0, mais lorsque j'execute le script, il m'indique toujours que la saisie incorrecte, meme lorsque je saisi 1 ou 0

Voici mon code :

#!/bin/bash
echo "!saisissez 1 ou 0"
read $reponse
 
while [[ "$reponse" != "1" && "$reponse" != "0" ]]
        do
 echo "Saisie incorrecte, reessayez"
 read $reponse
done

echo "ok"


J'ai essayé avec toutes les syntaxes possibles avec bash, j'ai meme testé si c'était le cas en gardant juste la premiere partie du test ($reponse étant égal à 1), meme probleme...

Merci !

2 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    read $reponse
    Enlève le "$" et ça devrait aller mieux ;-\

    read reponse
    ;-)
    0
  2. loftyramitsu Messages postés 43 Statut Membre 1
     
    Les $ avant les variable sont à retirer, mais la boucle infinie vient du '&&', il signifie 'et', or l'utilisateur ne peut pas saisir un 0 et un 1 à la fois, il faut donc le remplacer par un || (alt-gr7)
    La condition sera maintenant :
    Si l'utilisateur ne rentre NI un 0 NI un 1, alors on répète l'action.
    Avant, ta condition était :
    Si l'utilisateur ne rentre pas '0' ET '1' (en même temps), alors on répète l'action.
    Voici la correction que je te propose :
    (J'ai remplacé les echo par un read -p, ce qui réduit ton code et le rend plus lisible)

    #!/bin/bash

    # On demande à l'utilisateur de saisir 0 ou 1
    read -p 'Saisissez 0 ou 1 : ' reponse

    # La boucle
    while [$reponse != 1] || [$reponse != 0]
    do
    read -p 'Saisie incorrecte, reessayez : ' reponse
    done

    echo 'OK'
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      while [$reponse != 1] || [$reponse != 0]

      Il faut des espaces avant et après les crochets ;-\
      while [ $reponse != 1 ] || [ $reponse != 0 ] 



      Sinon, tant qu'à faire, autant se passer du ou/et (|| / &&) :

      #!/bin/bash
      set -x
      
      regex="[01]"
      
      # On demande à l'utilisateur de saisir 0 ou 1
      read -p 'Saisissez 0 ou 1 : ' reponse
      
      # La boucle
      while [[ ${reponse} != ${regex} ]]
      do
      read -p 'Saisie incorrecte, reessayez : ' reponse
      done
      
      echo 'OK'


      Ce qui donne :


      $ ./foo.sh 
      + regex='[01]'
      + read -p 'Saisissez 0 ou 1 : ' reponse
      Saisissez 0 ou 1 : 2
      + [[ 2 != [01] ]]
      + read -p 'Saisie incorrecte, reessayez : ' reponse
      Saisie incorrecte, reessayez : 6
      + [[ 6 != [01] ]]
      + read -p 'Saisie incorrecte, reessayez : ' reponse
      Saisie incorrecte, reessayez : 1
      + [[ 1 != [01] ]]
      + echo OK
      OK
      0
    2. Cobalt222S Messages postés 7 Statut Membre > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      ce n'est pas une regex.
      ou au moins != n'emploie pas de regex.
      pour que les double-crochets utilise un regex il faut recourir à l'opérateur =~
      la négation se fait par
      [[ ! motif =~ regex ]]

      $ re='^foo$'
      $ [[ foo != $re ]] && echo vrai || echo faux
      vrai
      or c'est faux : les motifs correspondent.
      $ [[ ! foo =~ $re ]] && echo vrai || echo faux
      faux
      en effet, les motifs correspondent : l'inégalité est fausse.

      PS : "c'est vrai parce que c'est faux" est particulièrement troublant. :)
      0
    3. kira
       
      Bonjour, merci pour vos réponses
      J'ai réussi avec le code suivant :

      #!/bin/bash
      echo "saisissez 1 ou 2"
      read reponse
      while [[ "$reponse" != "1" && "$reponse" != "0" ]]
      do
      echo "saisie incorrecte, reessayez"
      read reponse
      done
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > Cobalt222S Messages postés 7 Statut Membre
       
      PS : "c'est vrai parce que c'est faux" est particulièrement troublant. :)
      Mais c'est bon pour les méninges ;-)

      C'est d'ailleurs toute la complexité des conditions de test (
      man -P "less -p "^CONDITIONS"" bash
      ) si on emploie la négation ;-\
      0
    5. Cobalt222S Messages postés 7 Statut Membre > kira
       
      #!/bin/bash
      
      until [[ $reponse = [01] ]]
      do
          ((loop++)) && echo "saisie incorrecte"
          echo "saisissez 1 ou 0 : "
          read -r reponse
      done
      l'utilisateur va être surpris de taper 2, et de voir qu'il aurait fait une "erreur". ;)
      0