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 :

Probleme avec while read


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut Probleme avec while read
    Bonjour,

    Dans un ficher j'ai une liste de chemin d'accès pour d'autre fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    toto/toto1/
    toto/toto2/
    ...
    et je cherche à récupérer dans une variable ce chemin

    pour ça j'utilise la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    more +2 geom_to_check | while read $line
    do
    fichier_test=$line
    done
    Quand j'exécute le code j'ai ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read: « screening_1/screening_00_00 » : identifiant non valable
    je comprends pas l'erreur, est ce que c'est parce qu'il y a un slash et un underscore qu'il y a un problème si oui j'ai essayé de trouvé une solution en rajoutant avant afin qu'il prenne la fin de la ligne comme séparateur de champs mais ça marche pas.

    Quelqu'un aurait il une solution merci.

  2. #2
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Enleve le $ sur la ligne du while

    "more +2 geom_to_check | while read line"

  3. #3
    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 : 34
    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 450
    Points
    19 450
    Par défaut
    Salut.

    T'as essayé avec autre chose que more +2 ?
    Sinon, avec un for ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in `commande`
    do
          # traitements avec $i
    done
    Cordialement,
    Idriss

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    le more +2 c'est parce que je ne veux pas de la première ligne.
    Merci c'est effectivement le $ligne qui posait problème.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    Alors maintenant j'ai un autre soucis, il s'arrête pas à la fin du fichier.

  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 : 34
    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 450
    Points
    19 450
    Par défaut
    Toujours avec while ?

    Si oui tu peut faire comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    more +2 fichier | while read ligne
    do
        if [ "$ligne" = "" ]
        then
            exit
        else
            # traitements
        fi
    done
    Mais je pense que la boucle for serait plus adaptée (car l'écriture serait plus légère).

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    Bah au début c'est ce que je voulais faire utiliser for mais je voyait pas comment,

    en fait pour voir le problème dans l'ensemble :

    J'ai des fichiers qui contiennent des géométries et j'ai un script qui évalue si les géométries sont les mêmes.
    Donc dans un premier temps le script vérifie que le calcul a convergé si c'est le cas il écrit dans un fichier tout les chemins pour les job achevé correctement.

    Donc j'ai un fichier avec toutes les géométries que je veux comparer entre elle. je connais le nombre de ligne puisque j'ai créé le fichier.
    Ce que j'arrive pas à faire c'est
    Prendre la première ligne comme ref
    pour toutes les autres lignes du fichier je fais la comparaison des géométries pareil pas pareil.
    et je fais un fichier qui contient toutes celles qui ne sont pas semblable à la première ligne.
    A partir de ce nouveau fichier je veux refaire l'étape précédente.

    J'espère que l'explication est claire.

  8. #8
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Bonjour,

    Tu ne peux pas utiliser ton while read de cette manière en ligne de commande après un |.

    Essais avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    commande |{ while read line ; do echo "$line" ; done }

    Lilian.

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par lilian_h Voir le message
    Bonjour,

    Tu ne peux pas utiliser ton while read de cette manière en ligne de commande après un |.

    Essais avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    commande |{ while read line ; do echo "$line" ; done }

    Lilian.
    Cela fonctionne très bien d'utiliser un "while read line" après un |.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    oui chez moi aussi ça fonctionne bien

  11. #11
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    ça fonctionnera toujours sur KSH et BASH

  12. #12
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Alors ... désolé, chez moi ça ne fonctionne pas.

    Lilian.

  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 : 34
    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 450
    Points
    19 450
    Par défaut
    Ben chez moi aussi ça marche (Bash) ...

    @ lilian_h : tu utilises quel shell ? Qu'elle distribution ? Qu'elle version ? ça marche dans un script avec le bon shebang ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $SHELL
    ls -l $SHELL # pour plus de détails
    @ Erlen : tu n'a plus le problème de stopper la boucle avec ce que je t'ai donné ou pas ?

    Cordialement,
    Idriss

  14. #14
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Ok, évidement ça marche dans un script .... C'est moi qui n'ai rien compris à la demande de départ.
    Je ne sais pas comment j'ai fait, mais j'avais cru comprendre que la question concernait la ligne de commande ... désolé.

    Lilian.

  15. #15
    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 : 34
    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 450
    Points
    19 450
    Par défaut
    Citation Envoyé par lilian_h Voir le message
    Ok, évidement ca marche dans un script .... C'est moi qui n'est rien compris à la demande de départ.
    Je ne sais pas comment j'ai fais, mais j'avais cru comprendre que la question concernait la ligne de commande ...
    Peut être que c'est en ligne de commande, ce n'est pas précisé ET ça ne devrais rien changer (ou du moins Bash, Dash, Ksh et Zsh avec lesquels j'ai testé) ... Cela fonctionne très bien par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ ~] cat fichier | while read ligne; do echo $ligne; done;
    D'où mes précédentes questions.

    Cordialement,
    Idriss

  16. #16
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Ca alors ! On l'en apprend tous les jours !!!

    Depuis la nuit des temps je m'entête à mettre les { et } pour mes while en ligne de commande ... pour rien !

    Merci !

    Lilian.

  17. #17
    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 : 34
    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 450
    Points
    19 450
    Par défaut
    Mise à part dans les fonctions, je ne met jamais d'accolades pour délimiter des blocs d'instructions en Bash (il y a déjà les délimiteurs then/fi, do/done, etc).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 594
    Points : 19 473
    Points
    19 473
    Par défaut
    en fait les accolades ont leur utilité : un pipe créant un sous-shell, les variables qui y sont assignées ne sont pas disponible en dehors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cat monFichier | while read line; do [ -z "$premLine" ] && premLine="$line"; done
    echo "${premLine:-rien}"
    rien
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cat monFichier | { while read line; do [ -z "$premLine" ] && premLine="$line"; done
    echo "${premLine:-rien}"
    }
    quelquechose
    de toute façon more +2 fichier | while read line, c'est bof
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read line
    do if (( n++ ))
       then echo "$line" # ou traitement à partir de la deuxième ligne
       fi
    done < fichier

  19. #19
    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 : 34
    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 450
    Points
    19 450
    Par défaut
    N_BaH le roi du Bash a parlé

    pour tes explications.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    @ ok.Idriss
    Oui la commande fonctionne parfaitement.

    Mais j'ai finalement suivit ton conseil et mon avis personnel avant que je n'en vienne à l'idée du while c'est a dire utiliser un for
    Je pense avoir trouver une façon de faire, mon problème majeur c'est que j'avais plein de bout de script que j'avais déjà écrit et c'est tout faire fonctionné ensemble qui me pose/(posait j'espère) problème alors j'ai pris un exemple plus simple et j'ai fait un script qui fonctionne maintenant je vais adapter en partant de ce que j'ai compris.

    @N_BaH j'aime bien quand tu postes parce que le :
    un script correct est rarement (voire n'est jamais) écrit d'un seul jet !!
    me réconforte toujours beaucoup !

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

Discussions similaires

  1. Probleme avec while
    Par shomke dans le forum Général Python
    Réponses: 3
    Dernier message: 01/04/2009, 09h34
  2. probleme avec while Perl
    Par imorum dans le forum Langage
    Réponses: 2
    Dernier message: 21/01/2007, 19h03
  3. Problème avec while et paramètres
    Par mittim dans le forum Linux
    Réponses: 4
    Dernier message: 08/08/2006, 10h47
  4. Probleme avec WHILE
    Par beb30 dans le forum C
    Réponses: 14
    Dernier message: 05/04/2006, 14h40
  5. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42

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