Mechante boucle while infinie

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

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Salut,

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

    read reponse
    ;-)
    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'
      1. Contributeur
        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
      2. @zipe31ce 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. :)
      3. 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
      4. Contributeur
        @Cobalt222S
        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 ;-\
      5. @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". ;)