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