Faire une boucle tant que
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,
J'ai actuellement un code que je souhaite améliorer
J'aimerais que selon le paramètre $3 l'on puisse boucler autant de fois que le chiffre/nombre indiqué. Sans même m'occuper des erreurs liées à une mauvaise valeur je voulais savoir si une boucle for pourrait faire l'affaire. Ayant l'habitude du PHP c'est assez exotique les méthodes de ce langage.
J'ai actuellement un code que je souhaite améliorer
#!/bin/bash
clear
note=$1
classe=$2
eleve=$3
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
read -p 'Pouvez vous me donner un prénom : ' prenom
read -p 'Pouvez vous me donner un nom : ' nom
if [ 18 -le "$note" ]; then
resultat="Parfait"
elif [ 16 -le "$note" ]; then
resultat="Très bien"
elif [ 14 -le "$note" ]; then
resultat="Bien"
elif [ 11 -le "$note" ]; then
resultat="Assez bien"
elif [ "$note" -lt 11 ] && [ "$note" -ge 0 ]; then
resultat="Insuffisant"
elif [ "$note" -lt 0 ]; then
echo "Vous ne pouvez pas avoir en dessous de 0"
fi
$i++
echo "Merci "$prenom" "$nom" voici votre note : "$note". C'est "$resultat.
final=$prenom.$nom.$note.$resultat
echo $final >> notes.csv
exit 0
J'aimerais que selon le paramètre $3 l'on puisse boucler autant de fois que le chiffre/nombre indiqué. Sans même m'occuper des erreurs liées à une mauvaise valeur je voulais savoir si une boucle for pourrait faire l'affaire. Ayant l'habitude du PHP c'est assez exotique les méthodes de ce langage.
Configuration: Windows / Chrome 78.0.3904.87
2 réponses
-
Salut,
Pour répondre directement au titre, c'est une bouclewhile
ouuntil
qu'il te faut utiliser, dans le même genre que la bouclewhile
dans ton script, mais qu'avec une seule condition.
Par contre, avant d'aller plus loin, ton script est bourré d'incohérences ;-(- Les paramètres $2 et $3 ne sont pas contrôlés (comme le paramètre $1) ;-\
- La variable $i n'est initialisée nulle part et d'ailleurs à quoi sert-elle ? Et son incrémentation est préférable ainsi :
((i++))
- La variable $resultat n'est initialisée nulle part également. D'où sort-elle ?
-
Salut.
J'ai réussi à résoudre mon problème.
Le $1 est controlé a travers $note non ?
Pour le $3 je viens de la faire dans le code qui va suivre.
Le $2 peut rester hors de controle c'est pas grave.
J'ai corrigé le $i
$resultat me sers à noter la mention dans un fichier csv.
#!/bin/bash clear eleve=$3 while [[ -z $eleve]] || [[ $eleve -eq "${eleve##[0-9]*}" ]] do read -p 'Rentrez un nombre : ' eleve done for (( i=1; i <= $eleve; i++ )) do note=$1 classe=$2 while [[ -z $note ]] || [[ $note -gt 20 ]] || [[ $note -eq "${note##[0-9]*}" ]] do read -p 'Il faut une note entre 0 et 20 : ' note done read -p 'Pouvez vous me donner un prénom : ' prenom read -p 'Pouvez vous me donner un nom : ' nom if [ 18 -le "$note" ]; then resultat="Parfait" elif [ 16 -le "$note" ]; then resultat="Très bien" elif [ 14 -le "$note" ]; then resultat="Bien" elif [ 11 -le "$note" ]; then resultat="Assez bien" elif [ "$note" -lt 11 ] && [ "$note" -ge 0 ]; then resultat="Insuffisant" elif [ "$note" -lt 0 ]; then echo "Vous ne pouvez pas avoir en dessous de 0" fi echo "L'élève n°"$i": "$nom $prenom" a eu cette note: "$note". C'est "$resultat. final=$prenom.$nom.$note.$resultat echo $final >> notes.csv doneLe $1 est controlé a travers $note non ?
Oui.Pour le $3 je viens de la faire dans le code qui va suivre.
C'est bien ;-)Le $2 peut rester hors de controle c'est pas grave.
Il te faut un contrôle général qui vérifie qu'il y a bien 3 paramètres, sans quoi, ce sera le bordel s'il n'y a que 2 paramètres ou qu'un seul ;-\$resultat me sers à noter la mention dans un fichier csv.
S'il n'est pas défini, il ne sert à rien, et c'est le cas ;-\
-
Je réponds juste pour me transférer un code. Désolé j'ai pas trouvé d'autre moyen.
#!/bin/bash clear eleve=$1 classe=$2 for line in `cat notes.csv` do while [[ -z $eleve ]] || [[ $eleve -eq "${eleve##[0-9]*}" ]] do read -p 'Il faut un nombre délèves valide : ' eleve done for (( i=1; i <= $eleve; i++ )) do read -p 'Il faut une note entre 0 et 20 : ' note while [[ -z $note ]] || [[ $note -gt 20 ]] || [[ $note -eq "${note##[0-9]*}" ]] do read -p 'Mets une note entre 0 et 20 ! : ' note done read -p 'Pouvez vous me donner un prénom : ' prenom read -p 'Pouvez vous me donner un nom : ' nom if [ 18 -le "$note" ]; then resultat="Parfait" elif [ 16 -le "$note" ]; then resultat="Très bien" elif [ 14 -le "$note" ]; then resultat="Bien" elif [ 11 -le "$note" ]; then resultat="Assez bien" elif [ "$note" -lt 11 ] && [ "$note" -ge 0 ]; then resultat="Insuffisant" elif [ "$note" -lt 0 ]; then echo "Vous ne pouvez pas avoir en dessous de 0" fi id =`echo $line | awk -F";" '{ print $1 }'` echo "L'élève n°"$i": "$nom $prenom" a eu cette note: "$note". C'est "$resultat. echo $line #final=$prenom\n.$nom\n.$note\n.$resultat echo $id >> notes.csv done done-
Il y a toujours des erreurs et des incohérences dans ton script ;-(
id =`echo $line | awk -F";" '{ print $1 }'`Il ne faut pas d'espace autour du signe "égal" et les quotes inverses (`) ne sont plus d'actualité, mieux vaut lui préférer cette syntaxe$(echo $line | awk -F";" '{ print $1 }'), plus lisible.
Et avant d'utiliser des commandes externes (awk), autant se servir des fonctions du shell :$ A="1;2;3;4;5;6" $ echo "${A}" 1;2;3;4;5;6 $ echo "${A%%;*}" 1
Sans compter que je ne sais pas à quoi te sert cette fonction (echo $id >> notes.csv
) récupérer le 1er champ de ta ligne pour le réinjecter dans le fichier lu en entrée ;-((
-