Probleme boucle

Fermé
Benjamin - Modifié le 21 janv. 2020 à 15:43
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 22 janv. 2020 à 16:27
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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
21 janv. 2020 à 17:59
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
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > Benjamin
22 janv. 2020 à 11:00
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
Benjamin > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
22 janv. 2020 à 14:21
Le elif...then est imposé je suis dans un milieu scolaire.
0
Benjamin > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
22 janv. 2020 à 14:25
Par contre le code que tu m'a fournit ne fonctionne pas pour moi. Je ne sort jamais de la boucle.
0