[Bash] Pourquoi ma boucle ne marche pas ?

Résolu/Fermé
math_b67 Messages postés 529 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 1 juin 2021 - 8 août 2013 à 17:11
math_b67 Messages postés 529 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 1 juin 2021 - 9 août 2013 à 10:42
Bonjour,

J'aimerai savoir ce qui ne va pas dans mon while, elle ne me renvoi pas d'erreur mais continue à l'infini, meme quand je met "o" ou "n"...

Je m'arrache les cheveux alors que je suis sur que c'est très simple... Voici le code :

while [ -z "$confirm" ] || [ "$confirm" != "n" ] || [ "$confirm" != "o" ]
do                                              
echo ""
read -p "Confirmer la suppression du repo : $repo (o/n) : " confirm
done



Merci d'avance.


7 réponses

Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
8 août 2013 à 17:47
while 1
do
echo "\nConfirmer la suppression du repo : $repo (o/n) : "
read confirm

if [ $confirm = "o" ] || [ $confirm = "y" ] || [ -z $confirm ];
then
    break
fi
done 

Barbare et moche mais ça doit fonctionner
1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
8 août 2013 à 18:09
Par contre chez moi (GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)), ton script génère des erreurs d'abord à cause de "while 1" et ensuite avec la syntaxe de la commande "test". Voilà ce qui marche :

#! /bin/bash

while :
do
echo "\nConfirmer la suppression du repo : $repo (o/n) : "
read confirm

if [[ $confirm = "o" ]] || [[ $confirm = "n" ]] || [[ -z "${confirm}" ]]
then
    break
fi
done
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
9 août 2013 à 09:21
oui c'est mieux ^^
Mon while 1 c'est du C qui revient on dirais ^^
Pas mal des doubles [[ ]] =)
0
math_b67 Messages postés 529 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 1 juin 2021 69
Modifié par math_b67 le 9/08/2013 à 09:39
Bonjour a tous !!

Je planche sur cette boucle depuis 8h ce matin, et vous savez quoi ?! J'ai trouvé la solution !!! Héhé !
La voici :
while [ -z "$confirm" ] || [ "$confirm" != "n" ] && [ "$confirm" != "o" ]
do 
echo ""
read -p "Confirmer la suppression du repo : $repo (o/n) : " confirm 
done



Eh oui, un p*tain de && m'a fait chier pendant plusieurs heures, mais on l'a matté ce c*n !! Hahah ^^
(Pour résoudre ce problème, je me suis fais un tableau listant toutes les sorties possible de ma condition, c'est une technique que je conseille à tous quand vous avez ce genre de problème, ça permet de voir l'erreur rapidement ;-) )
Encore merci pour votre aide ;)
1
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
9 août 2013 à 09:49
ça semble logique maintenant ^^
Bien trouvé math =)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
9 août 2013 à 10:41
On peut se passer des "&&" et réduire l'expression :

while [ -z "$confirm" ] || [[ "$confirm" = [!on] ]]

;-))
0
math_b67 Messages postés 529 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 1 juin 2021 69
9 août 2013 à 10:42
Ok, je ne connaissais pas cette forme, merci :-)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
8 août 2013 à 17:17
Salut,

Parce qu'il faut casser ta boucle ;-))

#! /bin/bash

while [ -z "$confirm" ] || [ "$confirm" != "n" ] || [ "$confirm" != "o" ]
do                                              
echo ""
read -p "Confirmer la suppression du repo : $repo (o/n) : " confirm
break
done 

0
math_b67 Messages postés 529 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 1 juin 2021 69
8 août 2013 à 17:20
Re salut ;-)

J'avais essayé et il me sort cette erreur :
/bin/ldereposup: ligne 19 : [: -z : opérateur binaire attendu
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
Modifié par Lapourax le 8/08/2013 à 17:37
Donc moi j'ai dis de la daube '-_-

zipe dans ton cas la boucle va sortir au premier passage quelle que soit la valeur de $confirm non ?

La vie est un mystère qu'il faut vivre, et non un problème à résoudre. (Gandhi)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
Modifié par zipe31 le 8/08/2013 à 18:04
Effectivement dans ma première réponse je n'ai pas regardé le script et j'ai juste répondu à la question pourquoi la boucle était infinie ;-(
0
math_b67 Messages postés 529 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 1 juin 2021 69
8 août 2013 à 17:43
@Lapourax : une autre idée ? :-)

@zip : Si je fais cela, ma boucle s'arrête, peu importe la lettre qui est tapée par l'utilisateur donc cela ne me convient pas. Il faut que la boucle s'arrête au moment ou l'utilisateur tape "o" ou "n".

PS : J'aurais peut-etre du poster ce topic sur code-source maintenant que l'on est fusionné non ?... :P
0
math_b67 Messages postés 529 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 1 juin 2021 69
8 août 2013 à 17:55
Avec quelques correctifs ton script fonctionne Lapourax !
while :
do
echo ""
read -p "Confirmer la suppression du repo : $repo (o/n) : " confirm
if [ $confirm = "o" ] || [ $confirm = "n" ] || [ -z $confirm ] 
then
break
fi
done


Je vais l'utiliser en attendant, mais dès demain je vais quand même replancher sur cette boucle, c'est bizarre qu'elle ne passe pas...

Merci bien, à demain ;-)
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
8 août 2013 à 17:57
Un plaisir ;-)
Je supprime ma première réponse erronée que personne tombe dans le panneau
0