Faire une boucle tant que

Benjamin -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
    1. Benjamin
       
      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
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > Benjamin
         
        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
  2. Bojamin
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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