Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Bash] Demande d'aide

Sujet résolu
    28 octobre 2014 à 15:29:24

    Bonjour,

    Je suis actuellement en train de travailler sur un exercice de BASH. Cela va vous paraitre très simple, il faut pouvoir sortir les notes de chaque personne d'un fichier et les mettres dans un dossier au nom de la personne.

    Voici le fichier principal des notes :

    Nom!Prenom!Math!Anglais!OMGL!AP2
    DUPONT!Jean!12!16!10!6
    DURANT!Paul!10!8!14!16
    WANDERBUQUE!Rodolphe!4!6!13!8
    JUSTE!Alain!12!16!17!14

    Et le programme bash permettant la création de dossier et du fichier répertoriant les notes personnelles.

    #!/bin/bash
    
    exec < notes.txt
    
    while read
    do
    	nom=$(cut -d! -f1)
    	rm -r $nom
    	mkdir $nom
    
    	maths=$(cut -d! -f3)
    	anglais=$(cut -d! -f4)
    	omgl=$(cut -d! -f5)
    	ap2=$(cut -d! -f6)
    	
    	cd $nom
    	
    	echo "Vos notes sont: " > notesperso.txt
    	echo "Maths: $maths" >> notesperso.txt
    	echo "Anglais: $anglais" >> notesperso.txt
    	echo "OMGL: $omgl" >> notesperso.txt
    	echo "AP2: $ap2" >> notesperso.txt
    	cd ..
    done


    Lorsque j'essaye de le lancer, pas de message d'erreur. Seulement, il ne me crée  le fichier .txt que pour la première personne. De plus, les variables ne sont pas retranscrites dedans :

    Vos notes sont:
    Maths:
    Anglais:
    OMGL:
    AP2:

    Merci d'avance !

    -
    Edité par DarlokDarlok 28 octobre 2014 à 15:30:07

    • Partager sur Facebook
    • Partager sur Twitter
      28 octobre 2014 à 17:21:33

      Bonsoir,

      Utiliser cut n'était pas la bonne solution. Dès le premier cut on a le nom seulement et les autres cut ceux font à partir de la dernière donnée.

      J'aurais plutôt utilisé un tableau :

      #!/bin/bash
      
      exec < notes.txt
      while read -r line
      do
          array=(${line//!/ })
          nom="${array[0]}"
          prenom="${array[1]}"
          maths="${array[2]}"
          anglais="${array[3]}"
          omgl="${array[4]}"
          ap2="${array[5]}"
          
          if [[ -d $nom ]]
          then
              rm -r $nom
          fi
          mkdir $nom
          
          echo "Vos notes sont: " > "$nom"/"$prenom".txt
          echo "Maths: $maths" >> "$nom"/"$prenom".txt
          echo "Anglais: $anglais" >> "$nom"/"$prenom".txt
          echo "OMGL: $omgl" >> "$nom"/"$prenom".txt
          echo "AP2: $ap2" >> "$nom"/"$prenom".txt
      done
      rm -r Nom

      Ou :

      #!/bin/bash
      
      exec < notes.txt
      while read -r line
      do
          value="Nom!Prenom!Math!Anglais!OMGL!AP2"
          if [[ $line != *"$value"* ]]
          then
              array=(${line//!/ })
              nom="${array[0]}"
              prenom="${array[1]}"
              maths="${array[2]}"
              anglais="${array[3]}"
              omgl="${array[4]}"
              ap2="${array[5]}"
          
              if [[ -d $nom ]]
              then
                  rm -r $nom
              fi
              mkdir $nom
          
              echo "Vos notes sont: " > "$nom"/"$prenom".txt
              echo "Maths: $maths" >> "$nom"/"$prenom".txt
              echo "Anglais: $anglais" >> "$nom"/"$prenom".txt
              echo "OMGL: $omgl" >> "$nom"/"$prenom".txt
              echo "AP2: $ap2" >> "$nom"/"$prenom".txt
          fi
      done

      Bonne continuation.

      -
      Edité par pctronique 28 octobre 2014 à 17:43:13

      • Partager sur Facebook
      • Partager sur Twitter
        28 octobre 2014 à 17:48:22

        Merci beaucoup pour ta réponse !

        Je ne savais pas que les cut se basaient sur la dernière donnée, enfin dans ce type de cas du moins... Juste par curiosité, il y aurait un moyen de leurs dire de se refixer sur le fichier de base ? Peut être comme ça ?

        #!/bin/bash
         
        exec < notes.txt
         
        while read
        do
            nom=$(cut -d! -f1)
            rm -r $nom
            mkdir $nom
         
            maths=$(cut -d! -f3 notes.txt)
            anglais=$(cut -d! -f4 notes.txt)
            omgl=$(cut -d! -f5 notes.txt)
            ap2=$(cut -d! -f6 notes.txt)
        done



        • Partager sur Facebook
        • Partager sur Twitter
          28 octobre 2014 à 18:02:14

          Non, dans ce cas là vous allez obtenir, la valeur de chaque ligne :

          Pour DUPONT vous allez avoir pour math :

          Math
          12
          10
          4
          12
          Idem pour les autres, donc cut n'est pas approprié pour faire ce genre de travail.

          -
          Edité par pctronique 28 octobre 2014 à 18:02:55

          • Partager sur Facebook
          • Partager sur Twitter
            28 octobre 2014 à 20:10:14

            Juste une remarque pour le tableau, c'est beaucoup plus simple de le faire dans le read: while IFS='!' read nom prenom etc ; do ... done

            • Partager sur Facebook
            • Partager sur Twitter

            [Bash] Demande d'aide

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown