Faire une boucle tant que
Benjamin
-
zipe31 Messages postés 38797 Statut Contributeur -
zipe31 Messages postés 38797 Statut Contributeur -
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
A voir également:
- Faire une boucle tant que
- Faire une offre sur un lot vinted en tant que vendeur - Guide
- Tu dois avoir accès au live pour passer live en tant qu'invité - Forum TikTok
- Shutdown n'est pas reconnu en tant que commande interne - Forum Windows 10
- Ouvrir en tant qu'administrateur mac - Forum MacOS
- Tv orange chargement en boucle ✓ - Forum TV & Vidéo
2 réponses
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
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 ;-((
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.
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 ;-\