IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Boucle while ou for utilisée avec lame pour les mp3


Sujet :

Linux

  1. #1
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut Boucle while ou for utilisée avec lame pour les mp3
    Bonjour,
    j'ai tapé quelques lignes de codes et dans un cas j'obtiens bien ce que je souhaite mais pas dans l'autre: sauriez-vous m'expliquer la différence entre ces deux solutions pour convertir l'ensemble de mon répertoire où j'ai mes fichiers wav en mp3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ls *wav|while read i;do lame -V2 "$i" "$( echo "$i" | sed 's/wav/mp3/' )";done
    Qui marche nickel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for i in "$( ls *wav )";do lame -V2 "$i" "$( echo "$i" | sed 's/wav/mp3/' )";done
    qui ne marche pas...

    Merci et bonne soirée

  2. #2
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    essaie en enlevant les " " devant $(ls *wav)

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par figarojuju Voir le message
    Bonjour,
    j'ai tapé quelques lignes de codes et dans un cas j'obtiens bien ce que je souhaite mais pas dans l'autre: sauriez-vous m'expliquer la différence entre ces deux solutions pour convertir l'ensemble de mon répertoire où j'ai mes fichiers wav en mp3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ls *wav|while read i;do lame -V2 "$i" "$( echo "$i" | sed 's/wav/mp3/' )";done
    Qui marche nickel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for i in "$( ls *wav )";do lame -V2 "$i" "$( echo "$i" | sed 's/wav/mp3/' )";done
    qui ne marche pas...

    Merci et bonne soirée
    Mis à part un problème de guillemet, la différence tient dans la façon dont chaque boucle travaille

    1) la boucle for: utilise l'espace pour séparer ses éléments. Donc si t'as un fichier dont le nom contient un espace, style "ma musique.wav", ta boucle traitera ce fichier en 2 étapes
    - étape "ma"
    - étape "musique.wav"
    et aucune de ces 2 étapes ne fonctionnera vu qu'aucun des deux fichiers cités n'existe.

    2) boucle while read: utilise le fait que read se cale sur le <return> pour travailler et renvoie faux quand il n'a plus rien à lire. Donc tu remplis l'entrée standard avec le résultat du "ls" (plusieurs lignes) puis tu lis chaque ligne (terminée par un <return>) donc chaque fichier. Ca marche super bien même si t'as un espace dans ton nom de fichier mais le seul inconvénient, c'est que si tu crées une variable dans la boucle, elle disparait à la fin de du pipe (sous-processus).

    Voilà.

  4. #4
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    ah ouaiiii ces ****** d'espaces (excusez moi ) dans les noms de fichier, l'erreur à éviter absolument sous Linux. Combien de fois me suis-je arraché les cheveux à cause ça? Tout ça pour à chaque fois revenir sur un "while read" effectivement. Bizarrement j'y ai pas pensé hier.

  5. #5
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut Merci
    Bonjour,
    je me doutais qu'il pouvait y avoir une différence de ce type avec for et while. Mais même après avoir fait un help for et un help while, je ne l'avais pas si bien compris qu'avec ton explication.
    En tout cas merci pour vos aides respectives, je n'avais aucune idée comment traiter ces espaces!
    Bonne journée!

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par figarojuju Voir le message
    Mais même après avoir fait un help for et un help while, je ne l'avais pas si bien compris qu'avec ton explication.
    Faut juste savoir 2 choses:

    1) le while continue tant que la commande placée derrière renvoie "vrai" =>
    while test... while grep... while true...

    2) la commande "read" renvoie "faux" quand elle ne lit plus rien

    En associant ces deux infos, on arrive facilement au while read. Ne reste plus qu'à modifier l'entrée standard grace au pipe et on conclut avec
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
    commande_quelconque_qui_affiche_plein_de_lignes |while read lig
    do
        <traitement de chaque ligne stockée dans $lig>
    done

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    s le seul inconvénient, c'est que si tu crées une variable dans la boucle, elle disparait à la fin de du pipe (sous-processus)..
    Bonsoir

    En bash on peut éviter cet inconvénient par la substitution de processus

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    while read i ; do var=$i ; done < <(echo contenu)
    echo "$var"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire une boucle while ou for en rich:faces
    Par DevServlet dans le forum JSF
    Réponses: 4
    Dernier message: 27/10/2009, 14h21
  2. Problème condition d'arrêt boucles while et for
    Par Clairette29 dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/06/2008, 11h51
  3. boucle while et for
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 06/04/2006, 09h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo