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

Shell et commandes GNU Discussion :

Boucler sur un résultat de ls


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut Boucler sur un résultat de ls
    Bonjour à tous

    J'ai une petite problématique, que je n'arrive pas à résoudre, bien que j'ai cherché pas mal de tutos la dessus mais ça reste pas clair pour moi ...

    J'ai un script bash, qui fait un ls, et j'aimerai boucler sur les résultats.
    Mon code actuel ne fonctionne pas quand les répertoires contiennent des espaces, ça me scinde le nom du répertoire qui a un espace en 2 répertoires distincts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    newPaths="$(ls -d */ 2>/dev/null)"
    for newPath in $newPaths; do
        searchGitRepos "$1/${newPath:0:-1}"
    done
    Est-ce que quelqu'un peut m'aider à faire ça ?

    Merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    c'est pourquoi je préconise de ne pas utiliser ls dans un script afin d'en parcourir la sortie !

    d'autre part, ce n'est pas l'option -d qui permet de n'afficher que les sous-répertoires du répertoire donné en argument, c'est le développement de */ par le shell !

    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for d in ./*/; do echo "$d"; done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    Merci, je vais regarder ça.

    Du coup j'avais aussi une autre utilisation, qui ne pourra pas être corrigée via ce bout de code.

    J'aimerai quand même parser le retour d'une fonction, en l'uccrence git status --porcelain, qui retourne une ligne par fichier avec des infos dessus.
    Comment faire pour découper ce retour sur \n (je suppose, je suis pas sûr que ce soit le caractère de retour à la ligne du retour d'une fonction) ?

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    La FAQ Linux répond à ce genre de questions

    Pourquoi faut-il éviter d'utiliser la boucle for sur une sortie de commande ?
    Pourquoi faut-il éviter la commande ls dans les scripts ?

    Donc pour boucler sur une sortie de commande ligne par ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    commande|while read; do
         #...
    done
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read; do
        #...
    done < <(commande)
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read; do
        #...
    done <<< "$(commande)"
    Encore un peu de lecture : Quelques bonnes pratiques dans l'écriture de scripts en Bash

    Cordialement,
    Idriss

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    ah, non ! while read; do : ; done <<< "$(commande)", pas ça !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat < <(cat <<< "$(< ~/monFichier )")
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ah, non ! while read; do : ; done <<< "$(commande)", pas ça !
    Ben quoi ?

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    et pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read; do : ; done <<eof
    $(commande)
    eof
    ?


    ça me semble redondant (ça met en œuvre deux éléments de syntaxe (que l'on peut éviter) quand un seul peut le faire, alors qu'on ne peut éviter la redirection de la substitution de processus).

    et, si on a accès à <<<, <(commande) est disponible.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Citation Envoyé par ok.Idriss Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    commande|while read; do
         #...
    done
    Méthode la plus courante et la plus compatible, principal défaut: la boucle est un shell à part et donc les variables à droite du '|' ne seront pas exploitable par le programme principal qui est la commande.
    Citation Envoyé par ok.Idriss Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read; do
        #...
    done < <(commande)
    Alternative moins courante mais ici c'est la boucle qui devient le programme principal et la commande qui est un shell à part, en évitant ainsi le problème des variables du cas précédent.
    Citation Envoyé par ok.Idriss Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read; do
        #...
    done <<< "$(commande)"
    Celle-ci est l'alternative la moins compatible et ne doit s'utiliser (en mon sens) que dans le cas ou l'on souhaite passer en entrée une variable ou une chaine de caractère à une commande, exemple ici avec la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read; do
        #...
    done <<< "Chaine de caractere"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    VAR="Chaine de caractère"
    while read; do
        #...
    done <<< "$VAR"
    Cordialement.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    Super, merci à tous pour vos réponses !

    Du coup j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    command|while read $file; do
        # my code here
    done
    Par contre j'ai remarqué que si ma fonction retourne une ligne qui commence par un espace, dans $file, la chaine ne commence par par cet espace, mais au premier caractère alphanumérique. Par exemple git status --porcelain peut me retourner " M myFile", et dans $file, j'aurais donc "M myFile".

    Est-ce que quelqu'un a une idée du pourquoi, et comment corriger ça ?

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    c'est lié à l'IFS, tu pourrais l'effacer, mais je te recommande de ne pas le faire.
    utilise REPLY ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    command | while read               # pas d'argument passé à `read'
    do
       echo "$REPLY"
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    Génial, c'est exactement ce que je veux

    Merci à tous !

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Je suis sûr que c'est N_BaH qui a écrit cette faq
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Non c'est moi pour le coup (pour cette Q/R)
    Après on sait d'où vient l'inspiration

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

Discussions similaires

  1. [MySQL] Boucler sur les résultats d'un quiz
    Par Freedolphin dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/05/2011, 22h46
  2. Comment faire boucler un job sur le résultat d'une requête SQL ?
    Par galadorn dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 27/04/2011, 11h42
  3. Boucler sur des champs texte
    Par syl2095 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/11/2004, 16h15
  4. boucler sur des checkboxes
    Par El Saigneur dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 09/10/2004, 08h27
  5. [VB6] Comment boucler sur des controls d'un form ?
    Par lankviller dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2003, 16h29

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