Probleme boucle

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. Contributeur
    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


    ;-))
    1. 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.
    2. 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
    3. Contributeur
      @BenjaminPlutô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
    4. @zipe31Le elif...then est imposé je suis dans un milieu scolaire.
    5. @zipe31Par contre le code que tu m'a fournit ne fonctionne pas pour moi. Je ne sort jamais de la boucle.