Mechante boucle while infinie
kira
-
loftyramitsu Messages postés 43 Statut Membre -
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 :
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 !
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 !
A voir également:
- Boucle infinie bash
- Bingo bash free - Télécharger - Divers Jeux
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Bash addition - Forum Shell
- Code gta 5 ps3 vie infinie - Guide
- Tv orange chargement en boucle ✓ - Forum TV & Vidéo
2 réponses
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'
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'
Salut,
Il faut des espaces avant et après les crochets ;-\
Sinon, tant qu'à faire, autant se passer du ou/et (|| / &&) :
Ce qui donne :
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
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
PS : "c'est vrai parce que c'est faux" est particulièrement troublant. :)
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 vraior c'est faux : les motifs correspondent.
$ [[ ! foo =~ $re ]] && echo vrai || echo faux fauxen effet, les motifs correspondent : l'inégalité est fausse.
PS : "c'est vrai parce que c'est faux" est particulièrement troublant. :)