Probleme boucle

Benjamin -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Voici mon code de base :

#!/bin/bash

note=$1

if [[ -z $note ]]; then
echo "Error"
elif [[ $1 -eq "${note##[0-9]*}" ]]; then
echo "Error2"
elif [ 20 -lt "$note" ]; then
echo "Vous ne pouvez pas avoir au dessus de 20"
elif [ 18 -le "$note" ]; then
echo "Parfait"
elif [ 16 -le "$note" ]; then
echo "Très bien"
elif [ 14 -le "$note" ]; then
echo "Bien"
elif [ 12 -le "$note" ]; then
echo "Assez bien"
elif [ "$note" -lt 10 ] && [ "$note" -ge 0 ]; then
echo "Insuffisant"
elif [ "$note" -lt 0 ]; then
echo "Vous ne pouvez pas avoir en dessous de 0"
fi



Je cherche à faire en sorte de boucler cet algo pour que si l'utilisateur ne rentre pas une note valide il soit dans une boucle qui lui oblige.

J'ai commencé des "pistes"
 
note=$1
while [[ -z $note ]] || [[ $1 -eq "${note##[0-9]*}" ]] 
do 
    echo -e "Saisir entre 0 et 20 : \c"
    read note 
done 
exit 0


Malheureusement j'ai 2 questions.

Peut-on mettre une condition pour passer outre la boucle si un chiffre entre 0 et 20 est rentré.
Comment mettre une sorte d'intervalle un peu à la {0..20} mais pour dire "si tu n'est pas un entier entre 0 et 20 tu passes dans la boucle".

Configuration: Windows / Chrome 78.0.3904.87

1 réponse

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Les conditions
    while
    ,
    until
    et
    for
    , peuvent utiliser les fonctions
    break
    et
    continue
    dans leur boucle.

    Voilà un exemple adapter à ton cas :


    Et le code bien sûr :

    #!/bin/bash
    #set -xv
    
    clear
    
    regex="^[0-2]{,1}[0-9]{1}$"
    note=$1
    
    while [[ -z $note ]] || [[ ! ${note} =~ ${regex} ]] || [[ ${note} -gt 20 ]]
    do
        read -p  "Saisir un chiffre : " note
        continue
    done
    
    echo "Ben voilà ;-)"
    exit 0


    ;-))
    0
    1. Benjamin
       
      Merci pour ton message.
      J'ai réussi à faire ce que je voulais.

      #!/bin/bash

      note=$1

      while [[ -z $note ]] || [[ $note -gt 20 ]] || [[ $note -eq "${note##[0-9]*}" ]]
      do
      read -p 'Il faut absolument mettre une note entre 0 et 20 : ' note
      done

      if [ 18 -le "$note" ]; then
      echo "Parfait"
      elif [ 16 -le "$note" ]; then
      echo "Très bien"
      elif [ 14 -le "$note" ]; then
      echo "Bien"
      elif [ 12 -le "$note" ]; then
      echo "Assez bien"
      elif [ "$note" -lt 10 ] && [ "$note" -ge 0 ]; then
      echo "Insuffisant"
      elif [ "$note" -lt 0 ]; then
      echo "Vous ne pouvez pas avoir en dessous de 0"
      fi

      exit 0


      Néanmoins c'est pas parfait car les caractères spéciaux font buger le programme.
      0
    2. Benjamin
       
      Du coup je viens de regarder ton code. C'est cool c'est ce que je cherchais. Je vais fusionner les deux pour faire une chimère. Merci
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > Benjamin
       
      Plutôt que des
      elif…then
      à la pelle, j'utiliserais un
      case…esac
      pour les intervalles de note.

      #!/bin/bash
      #set -xv
      
      clear
      
      regex="^[0-2]{,1}[0-9]{1}$"
      note=$1
      
      while [[ -z $note ]] || [[ ! ${note} =~ ${regex} ]] || [[ ${note} -gt 20 ]]
      do
          read -p  "Saisir un chiffre : " note
          continue
      done
      
      case "${note}" in
        1[8,9]) echo "Parfait";;
        1[6,7]) echo "Très bien";;
        1[4,5]) echo "Bien";;
        1[2,3]) echo "Assez bien";;
        1[0,1]) echo "Passable";;
        [0-9])  echo "Insuffisant";;
        *)      echo "Résultat inexact";;
      esac
      exit 0
      0
    4. Benjamin > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Le elif...then est imposé je suis dans un milieu scolaire.
      0
    5. Benjamin > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Par contre le code que tu m'a fournit ne fonctionne pas pour moi. Je ne sort jamais de la boucle.
      0