Bash: problème avec while

Bonsoir à tous !!!

voila je suis coincé avec un petit problème,

j=1 
while [ $j -lt 11 ]
do
mplayer 'head -$j /home/clem/Musique/test3 | tail -1' -vc null -vo null -ao pcm:file=/home/clem/Musique/Diab-Laury/'head -$n/home/clem/Musique/SoundCloud/.soundcloud/nom | tail -1'.wav


alors voila, ne sais pas comment remplacer la varibla $n par un nom. c'est en fait une liste de nom dans un fichier

j'ai testé

plusieurs chose ainsi que ca:

j=1 
while [ $j -lt 11 ]
do
n=0
while [ $n -lt 11 ]
do
n=$n+1
done
mplayer 'head -$j /home/clem/Musique/SoundCloud/.soundcloud/test3 | tail -1' -vc null -vo null -ao pcm:file=/home/clem/Musique/SoundCloud/Diab-Laury/'head -$n /home/clem/Musique/SoundCloud/.soundcloud/nom | tail -1'.wav
let j=$j+1
done


mais ca marche pas non plus.

merci d'avance à tous

10 réponses

Résumé de la discussion

La problématique porte sur l’utilisation d’une boucle Bash pour lire des noms depuis un fichier et les insérer dans des chemins et noms de fichier lors d’un traitement audio avec mplayer. Plusieurs solutions évoquées dans les réponses consistent à clarifier le problème et à exploiter des méthodes comme grep, awk et sed pour extraire les URL et les titres, puis boucler sur les noms. En pratique, les échanges suggèrent d’obtenir les entrées exactes (test3, scd.txt, title.txt) et d’opter pour une boucle for ou une lecture ligne par ligne afin d’éviter l’écrasement des noms.

Bobot (l’IA à votre service)
  1. salut,

    si tu commançais par exposer ton problème plus clairement, tu aurais, par toi-même peut-être, un début de réponse.

    décris plus précisément le problème, avec des échantillons de tes fichiers.

    ce que tu as
    ce que tu veux
    les étapes pour obtenir ce que tu veux
    les obstacles que tu rencontres
    à quel niveau
    1
    1. hello !!

      oui effectivement d'habitude j'explique un peu mieux ^^

      alors en fait, ma boucle sert à générer le paramètre pour la commande 'head'

      head -1 fichier par exemple, ben la je voulais utiliser une boucle pour remplacer le 1 par des valeurs.
      en fait jusque là ca fonctionne. Maintenant le petit hic c'est que dans ma commande j'ai 2 fois la commande 'head' avec des param differents

      mplayer '<souligne>head </souligne>-$j /home/clem/Musique/test3 | tail -1' -vc null -vo null -ao pcm:file=/home/clem/Musique/Diab-Laury/'head -$n/home/clem/Musique/SoundCloud/.soundcloud/nom | tail -1'.wav


      si je fait un boucle pour le premier 'head', aucun problème

      j=1 
      while [ $j -lt 11 ]
      do
      mplayer '<souligne>head </souligne>-$j /home/clem/Musique/test3 | tail -1' -vc null -vo null -ao pcm:file=/home/clem/Musique/Diab-Laury/'head -$n/home/clem/Musique/SoundCloud/.soundcloud/nom | tail -1'.wav
      let j=$j+3
      done


      le parametre du premier 'head' est bien remplacé.

      par contre le paramètre du second 'head' (que j'aimerais simplement incrementer de 1) je ne sais pas comment le générer par ce que je suis dans la meme comande.

      Merci d'avance ;), j'espère que c'est clair...
      0
      1. Contributeur
        hello
        le deuxième head peut-être remplacé par une boucle:
        ....pcm:file=/home/clem/Musique/Diab-Laury/$(for n in 1 2 3 4;do head -$n....... ; done).wav
        0
        1. musiques=~/Musique
          j=1
          while [ $j -lt 11 ]
          do
             mplayer 'sed -n ${j}p $musiques/test3' -vc null -vo null -ao pcm:file=$musiques/Diab-Laury/'sed -n $((j+1))p $musiques/SoundCloud/.soundcloud/nom'.wav
             j=$((j+3))
          done
          ou bien
          musiques=~/Musiques
          while read -r fichier
          do
             j=$((j+1))
             test $j -lt 11 && mplayer "$fichier" -vc null -vo null -ao pcm:file=$musiques/Diab-Laury/'sed -n $((j+1))p $musiques/SoundCloud/.soundcloud/nom'.wav || break
          done <$musiques/test3


          mais pourquoi 11 ? il y a quelque chose après la onzième ligne, ou le fichier ne compte-t-il que onze lignes ?
          0
          1. oui il y a onze ligne, 1vide plus les 10autres ^^

            en gros je wget une source, je recup les lignes voulu dans un fichier
            je prend ce fichier je recup 2 sortes d'info, un lien et un nom.
            les liens sont pour mplayer et les nom sont pour les titre des sons (second head)

            pour être clair le script permet de dl un son de soundcloud ou alors tout les sons d'une page.

            il fonctionne très bien, j'avais juste remplacé les titres par l'heure minute seconde pour ne pas 'quil s'ecrase xD

            Je viens de tester avec le for, ca marche... mais ca me lit que la première ligne de mon fichier, les autres lignes ne sont pas lues... enfin il me dl bien chaque fichier mais lui donne comme nom la première ligne... du coup ca ecrase a chaque fois
            0
            1. montre-nous les fichiers, et un exemple de commande type, ce sera plus clair.

              on reprend
              d'abord
              wget -O page_reçue.html http://page_demandée.html
              ensuite...

              comment en arrives-tu à avoir deux fichiers ?
              0
              1. #extraction des lignes contenant l'url du flux audio vers scd.txt
                        grep 'http://media.soundcloud.com/stream/' 'ls -l | head -2 | tail -1 | cut -d\  -f 13' > scd.txt
                
                        #extraction des titres
                        cat scd.txt | awk -F 'title' '{print $2}' | awk -F '\"' '{print $3}' | tr ' ' '-' > title.txt
                

                ensuite

                i=3
                        while [ $i -lt 30 ]
                        do
                        head -$i /Users/cfiguiere/Music/SoundCloud/.soundcloud/scd.txt | awk -F 'streamUrl' '{print $2}' | awk -F '\"' '{print $3}' | tail -3 >> /Users/cfiguiere/Music/SoundCloud/.soundcloud/test2
                        let i=$i+3
                        done
                        cat /Users/cfiguiere/Music/SoundCloud/.soundcloud/test2 | sort -u >> /Users/cfiguiere/Music/SoundCloud/.soundcloud/test3


                et la fameuse boucle de la fin

                j=1
                		while [ $j -lt 11 ]
                		do
                		mplayer 'head -$j /Users/cfiguiere/Music/SoundCloud/.soundcloud/test3 | tail -1' -vc null -vo null -ao pcm:file=/Users/cfiguiere/Music/SoundCloud/'head -1 /Users/cfiguiere/Music/SoundCloud/.soundcloud/scd.txt | awk -F 'username' '{print $2}' | awk -F '\"' '{print $3}' | tr ' ' '-''/$(for t in 1 2 3 4 5 6 7 8 9 10;do head -$t /Users/cfiguiere/Music/SoundCloud/.soundcloud/title | tail -1 ; done).wav
                		let j=$j+1 
                		done


                ca aide assez ?
                0
                1. Contributeur
                  Salut,

                  On pourrait avoir le fichier source s'il te plaît ? (cjoint ou autres)
                  Et à la limite un exemple de ce que chacune de tes commandes est censée retourner ?
                  0
                2. ben ca m'embete un peu, pas que je ne veux pas le partager, bien au contraire mais j'aimerais le finir avant. par contre je peux l'envoyer par mail si vous voulez :)
                  0
                3. Contributeur
                  bien au contraire mais j'aimerais le finir avant.
                  Pas compris désolé ;-(
                  0
                4. j'ai pas envie de le poster comme ca, il est fonctionnel a part mon prob avec la boucle donc je propose de l'envoyer par mail ou par la poste si tu veux ^^
                  0
                5. Contributeur
                  On parle bien de la même chose, à savoir le fichier source (html) récupéré par la commande wget ?
                  0
              2. et pour info, voila les messages ressorti par mplayer
                
                AO PCM] File: /Users/cfiguiere/Music/SoundCloud/Roaring-Spirit/Teachings-Of-Dub-Part-01 (WAVE)
                PCM: Samplerate: 44100Hz Channels: Stereo Format s16le
                [AO PCM] Info: Faster dumping is achieved with -vc null -vo null -ao pcm:fast
                [AO PCM] Info: To write WAVE files use -ao pcm:waveheader (default).
                AO: [pcm] 44100Hz 2ch s16le (2 bytes per sample)
                Video: no video
                Starting playback...
                A: 208.1 (03:28.1) of 208.0 (03:28.0)  0.7% 0% 
                
                Playing Phenix.
                File not found: 'Phenix'
                Failed to open Phenix.
                
                
                Playing Warrior-Style-Part-2---Mix.
                File not found: 'Warrior-Style-Part-2---Mix'
                Failed to open Warrior-Style-Part-2---Mix.
                
                
                Playing Warrior-Style-Part-1---Mix.
                File not found: 'Warrior-Style-Part-1---Mix'
                Failed to open Warrior-Style-Part-1---Mix.
                
                
                Playing Dawn-Stepper-(dub2).
                File not found: 'Dawn-Stepper-(dub2)'
                Failed to open Dawn-Stepper-(dub2).
                0
                1. et voila http://dl.free.fr/getfile.pl?file=/rEi3rWUq

                  mais pourquoi tu veux le code source de la page, zip31 ?
                  0
                  1. Contributeur
                    Pour voir ce que tu veux exactement récupérer et s'il n'y a pas plus simple à faire...

                    Par contre j'ai besoin de savoir ce que sont censées récupérer exactement les commandes suivantes :

                    #extraction des lignes contenant l'url du flux audio vers scd.txt
                            grep 'http://media.soundcloud.com/stream/' 'ls -l | head -2 | tail -1 | cut -d\  -f 13' > scd.txt
                    
                            #extraction des titres
                            cat scd.txt | awk -F 'title' '{print $2}' | awk -F '\"' '{print $3}' | tr ' ' '-' > title.txt

                    Je n'ai pas bien pigé ton grep sur la sortie de "ls...."
                    0
                  2. ca c'est parce que je n'ai pas utilisé wget -o name url xD
                    c'est du moi prose de tete a 100%, en fait je bosse dans un dossier dont le contenu est effacé a chaque fin du script, donc en gros le grep agit sur le seul fichier ( a ce moment là du script) qui est présent dans le dossier.

                    ensuite pour les titre, je recup le fichier scd et je recherche le mot "title" en decoupant tout ce qu'il y a autour pour pouvoir récup uniquement les titre des sons que je retravail pour remplacer les espace par '-' et je renvoi tout ca dans un fichier qui sera utilié par la suite dans mplayer pour donner un nom au son. (c'est que je coince avec ce fichiet et ma boucle contenant la commande mplayer)
                    0
                  3. Contributeur
                    et je renvoi tout ca dans un fichier qui sera utilié par la suite dans mplayer pour donner un nom au son. (c'est que je coince avec ce fichiet et ma boucle contenant la commande mplayer)
                    D'où ma demande ;-\

                    Si on ne sait pas ce que tu récupères en sortie et comment, il nous sera difficile de t'aider et encore moins de trouver où ça coince.

                    Donc, merci de nous donner les compléments d'infos demandés !

                    A savoir, pour chaque commande de ton script, et à chaque étape, une idée de ce qui entre et sort et de ce que tu voudrais réellement.

                    Par exemple pour le fichier que tu m'as envoyé, qu'est-ce qui doit rester après traitement et se trouver dans le fichier "scd.txt" ???
                    0
                  4. je ressort ca

                    window.SC.bufferTracks.push({"id":48365485,"uid":"JTIyyF0lPsDv","user":{"username":"Roaring Spirit","permalink":"roaringspirit"},"uri":"/roaringspirit/teachings-of-dub-part-01","duration":1431088,"token":"mUBNY","name":"teachings-of-dub-part-01","title":"Teachings Of Dub Part 01","commentable":true,"revealComments":true,"commentUri":"/roaringspirit/teachings-of-dub-part-01/comments/","streamUrl":"http://media.soundcloud.com/stream/JTIyyF0lPsDv?stream_token=mUBNY","waveformUrl":"http://w1.sndcdn.com/JTIyyF0lPsDv_m.png","propertiesUri":"/roaringspirit/teachings-of-dub-part-01/properties/","statusUri":"/transcodings/JTIyyF0lPsDv","replacingUid":null,"preprocessingReady":true,"renderingFailed":false,"isPublic":true,"geo":[],"commentableByUser":true,"favorite":false,"followingTrackOwner":false});
                    window.SC.bufferTracks.push({"id":44519972,"uid":"8M9mn0IjSW5i","user":{"username":"Roaring Spirit","permalink":"roaringspirit"},"uri":"/roaringspirit/phenix","duration":208196,"token":"Fh2Wm","name":"phenix","title":"Phenix","commentable":true,"revealComments":true,"commentUri":"/roaringspirit/phenix/comments/","streamUrl":"http://media.soundcloud.com/stream/8M9mn0IjSW5i?stream_token=Fh2Wm","waveformUrl":"http://w1.sndcdn.com/8M9mn0IjSW5i_m.png","propertiesUri":"/roaringspirit/phenix/properties/","statusUri":"/transcodings/8M9mn0IjSW5i","replacingUid":null,"preprocessingReady":true,"renderingFailed":false,"isPublic":true,"geo":[],"commentableByUser":true,"favorite":false,"followingTrackOwner":false});
                    window.SC.bufferTracks.push({"id":34814028,"uid":"inMUQpwy2aKP","user":{"username":"Roaring Spirit","permalink":"roaringspirit"},"uri":"/roaringspirit/warrior-style-part-2-mix","duration":2266043,"token":"6DJVj","name":"warrior-style-part-2-mix","title":"Warrior Style Part 2 - Mix","commentable":true,"revealComments":true,"commentUri":"/roaringspirit/warrior-style-part-2-mix/comments/","streamUrl":"http://media.soundcloud.com/stream/inMUQpwy2aKP?stream_token=6DJVj","waveformUrl":"http://w1.sndcdn.com/inMUQpwy2aKP_m.png","propertiesUri":"/roaringspirit/warrior-style-part-2-mix/properties/","statusUri":"/transcodings/inMUQpwy2aKP","replacingUid":null,"preprocessingReady":true,"renderingFailed":false,"isPublic":true,"geo":[],"commentableByUser":true,"favorite":false,"followingTrackOwner":false});
                    window.SC.bufferTracks.push({"id":34078724,"uid":"it3xDPhavXNB","user":{"username":"Roaring Spirit","permalink":"roaringspirit"},"uri":"/roaringspirit/warrior-style-part-1-mix","duration":2319902,"token":"eoHE9","name":"warrior-style-part-1-mix","title":"Warrior Style Part 1 - Mix","commentable":true,"revealComments":true,"commentUri":"/roaringspirit/warrior-style-part-1-mix/comments/","streamUrl":"http://media.soundcloud.com/stream/it3xDPhavXNB?stream_token=eoHE9","waveformUrl":"http://w1.sndcdn.com/it3xDPhavXNB_m.png","propertiesUri":"/roaringspirit/warrior-style-part-1-mix/properties/","statusUri":"/transcodings/it3xDPhavXNB","replacingUid":null,"preprocessingReady":true,"renderingFailed":false,"isPublic":true,"geo":[],"commentableByUser":true,"favorite":false,"followingTrackOwner":false});
                    window.SC.bufferTracks.push({"id":27426870,"uid":"Qv2FNi6N0aPx","user":{"username":"Roaring Spirit","permalink":"roaringspirit"},"uri":"/roaringspirit/dawn-stepper-dub2","duration":229390,"token":"i75eZ","name":"dawn-stepper-dub2","title":"Dawn Stepper (dub2)","commentable":true,"revealComments":true,"commentUri":"/roaringspirit/dawn-stepper-dub2/comments/","streamUrl":"http://media.soundcloud.com/stream/Qv2FNi6N0aPx?stream_token=i75eZ","waveformUrl":"http://w1.sndcdn.com/Qv2FNi6N0aPx_m.png","propertiesUri":"/roaringspirit/dawn-stepper-dub2/properties/","statusUri":"/transcodings/Qv2FNi6N0aPx","replacingUid":null,"preprocessingReady":true,"renderingFailed":false,"isPublic":true,"geo":[],"commentableByUser":true,"favorite":false,"followingTrackOwner":false});
                    window.SC.bufferTracks.push({"id":27426434,"uid":"qpeDlaJKmQbV","user":{"username":"Roaring Spirit","permalink":"roaringspirit"},"uri":"/roaringspirit/tribulation-rmx","duration":211567,"token":"7YODd","name":"tribulation-rmx","title":"Tribulation (rmx)","commentable":true,"revealComments":true,"commentUri":"/roaringspirit/tribulation-rmx/comments/","streamUrl":"http://media.soundcloud.com/stream/qpeDlaJKmQbV?stream_token=7YODd","waveformUrl":"http://w1.sndcdn.com/qpeDlaJKmQbV_m.png","propertiesUri":"/roaringspirit/tribulation-rmx/properties/","statusUri":"/transcodings/qpeDlaJKmQbV","replacingUid":null,"preprocessingReady":true,"renderingFailed":false,"isPublic":true,"geo":[],"commentableByUser":true,"favorite":false,"followingTrackOwner":false});
                    window.SC.bufferTracks.push({"id":27426251,"uid":"DcFLBjxLpZ5c","user":{"username":"Roaring Spirit","permalink":"roaringspirit"},"uri":"/roaringspirit/tribulation-dub-rmx","duration":212377,"token":"N8wXi","name":"tribulation-dub-rmx","title":"Tribulation Dub (rmx)","commentable":true,"revealComments":true,"commentUri":"/roaringspirit/tribulation-dub-rmx/comments/","streamUrl":"http://media.soundcloud.com/stream/DcFLBjxLpZ5c?stream_token=N8wXi","waveformUrl":"http://w1.sndcdn.com/DcFLBjxLpZ5c_m.png","propertiesUri":"/roaringspirit/tribulation-dub-rmx/properties/","statusUri":"/transcodings/DcFLBjxLpZ5c","replacingUid":null,"preprocessingReady":true,"renderingFailed":false,"isPublic":true,"geo":[],"commentableByUser":true,"favorite":false,"followingTrackOwner":false});
                    window.SC.bufferTracks.push({"id":27425623,"uid":"xdYhdPXAfeWE","user":{"username":"Roaring Spirit","permalink":"roaringspirit"},"uri":"/roaringspirit/wood-stepper","duration":205139,"token":"8z4TG","name":"wood-stepper","title":"Wood Stepper","commentable":true,"revealComments":true,"commentUri":"/roaringspirit/wood-stepper/comments/","streamUrl":"http://media.soundcloud.com/stream/xdYhdPXAfeWE?stream_token=8z4TG","waveformUrl":"http://w1.sndcdn.com/xdYhdPXAfeWE_m.png","propertiesUri":"/roaringspirit/wood-stepper/properties/","statusUri":"/transcodings/xdYhdPXAfeWE","replacingUid":null,"preprocessingReady":true,"renderingFailed":false,"isPublic":true,"geo":[],"commentableByUser":true,"favorite":false,"followingTrackOwner":false});
                    


                    mais heuuu... la seule chose qui coince c'est que je ne suis pas au point pour la boucle while avec $i et $j a l'intérieure en fait
                    0
                  5. bon si je precise pas, pas d'interet.

                    en gros ca me ressort tout les lignes contenant ceci: "streamUrl":"http://media.soundcloud.com/stream
                    0
                2. awk '/http:\/\/media\.soundcloud\.com\/stream\//{   
                        split($0,a,"title")   
                        split($0,b,"streamUrl")   
                  
                     gsub(" ","_",a[2])   
                     split(a[2],c,"\"")   
                     split(b[2],d,"\"")   
                  
                     print c[3]" "d[3]   
                  }' ~/Téléchargements/roaringspirit | while read titre adresse 
                  do echo mplayer "$adresse" -vc null -vo null -ao "pcm:$titre" 
                  done


                  fichiers temporaires? a p'u!
                  code plus que bizarroïde? a p'u!

                  ça devrait fonctionner.
                  si le code affiche ce que tu veux, enlève le 'echo'.
                  0
                  1. Contributeur
                    Salut,

                    while read titre adresse
                    do echo mplayer "$adresse" -vc null -vo null -ao "pcm:$title"


                    Y'aurait-y pas comme un os ? ;-\

                    ;-))
                    0
                  2. rhoo, tu chipotes :)

                    j'ai corrigé, merci.
                    0