Probleme boucle
Benjamin
-
zipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Voici mon code de base :
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"
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".
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
-
Salut,
Les conditionswhile
,until
etfor
, peuvent utiliser les fonctionsbreak
etcontinue
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
;-))
-
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. -
-
Plutôt que des
elif…then
à la pelle, j'utiliserais uncase…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 -
-
-