[Bash] Pourquoi ma boucle ne marche pas ?

Résolu
math_b67 Messages postés 604 Statut Membre -  
math_b67 Messages postés 604 Statut Membre -
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

  1. Lapourax Messages postés 2970 Date d'inscription   Statut Contributeur Dernière intervention   336
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
    2. Lapourax Messages postés 2970 Date d'inscription   Statut Contributeur Dernière intervention   336
       
      oui c'est mieux ^^
      Mon while 1 c'est du C qui revient on dirais ^^
      Pas mal des doubles [[ ]] =)
      0
  2. math_b67 Messages postés 604 Statut Membre 74
     
    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
    1. Lapourax Messages postés 2970 Date d'inscription   Statut Contributeur Dernière intervention   336
       
      ça semble logique maintenant ^^
      Bien trouvé math =)
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      On peut se passer des "&&" et réduire l'expression :

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

      ;-))
      0
    3. math_b67 Messages postés 604 Statut Membre 74
       
      Ok, je ne connaissais pas cette forme, merci :-)
      0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  4. math_b67 Messages postés 604 Statut Membre 74
     
    Re salut ;-)

    J'avais essayé et il me sort cette erreur :
    /bin/ldereposup: ligne 19 : [: -z : opérateur binaire attendu
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Lapourax Messages postés 2970 Date d'inscription   Statut Contributeur Dernière intervention   336
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  7. math_b67 Messages postés 604 Statut Membre 74
     
    @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
  8. math_b67 Messages postés 604 Statut Membre 74
     
    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
    1. Lapourax Messages postés 2970 Date d'inscription   Statut Contributeur Dernière intervention   336
       
      Un plaisir ;-)
      Je supprime ma première réponse erronée que personne tombe dans le panneau
      0