Mechante boucle while infinie

Fermé
kira - Modifié le 16 avril 2020 à 16:47
loftyramitsu Messages postés 37 Date d'inscription vendredi 27 mars 2020 Statut Membre Dernière intervention 29 juin 2020 - 12 mai 2020 à 18:27
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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
16 avril 2020 à 17:22
Salut,

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

read reponse
;-)
0
loftyramitsu Messages postés 37 Date d'inscription vendredi 27 mars 2020 Statut Membre Dernière intervention 29 juin 2020 1
6 mai 2020 à 19:39
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
7 mai 2020 à 07:43
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
Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
Modifié le 7 mai 2020 à 10:36
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020
7 mai 2020 à 11:11
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
Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020 > kira
Modifié le 7 mai 2020 à 11:18
#!/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