Faire une boucle tant que
Fermé
Benjamin
-
Modifié le 28 janv. 2020 à 15:50
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 18 févr. 2020 à 09:19
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 18 févr. 2020 à 09:19
2 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
27 janv. 2020 à 13:57
27 janv. 2020 à 13:57
Salut,
Pour répondre directement au titre, c'est une boucle
Par contre, avant d'aller plus loin, ton script est bourré d'incohérences ;-(
Pour répondre directement au titre, c'est une boucle
whileou
untilqu'il te faut utiliser, dans le même genre que la boucle
whiledans 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 ?
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
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
18 févr. 2020 à 09:19
18 févr. 2020 à 09:19
Il y a toujours des erreurs et des incohérences dans ton script ;-(
Et avant d'utiliser des commandes externes (awk), autant se servir des fonctions du shell :
Sans compter que je ne sais pas à quoi te sert cette fonction (
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 ;-((
Modifié le 28 janv. 2020 à 15:51
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.
27 janv. 2020 à 15:24
C'est bien ;-)
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 ;-\
S'il n'est pas défini, il ne sert à rien, et c'est le cas ;-\