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
Bonjour,

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

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
Salut,

Pour répondre directement au titre, c'est une boucle
while
ou
until
qu'il te faut utiliser, dans le même genre que la boucle
while
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 ?


0
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

    done
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419 > Benjamin
27 janv. 2020 à 15:24
Le $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 ;-\
0
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
0
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
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 ;-((
0