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
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
A voir également:
- Boucle infinie bash
- Minimal bash-like line editing is supported ✓ - Forum Linux / Unix
- Boucle cmd - Forum Programmation
- Bingo bash free - Télécharger - Divers Jeux
- Bash permission non accordée - Forum Shell
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
2 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
16 avril 2020 à 17:22
16 avril 2020 à 17:22
Salut,
read $reponseEnlève le "$" et ça devrait aller mieux ;-\
read reponse;-)
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
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'
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'
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
7 mai 2020 à 07:43
7 mai 2020 à 07:43
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
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
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
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. :)
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
>
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
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 ;-\
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
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 donel'utilisateur va être surpris de taper 2, et de voir qu'il aurait fait une "erreur". ;)