Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/01/2011, 11h37   #1
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 142
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 142
Points : 33
Points : 33
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 :
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 :
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 :
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.
Erlen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 11h45   #2
Invité régulier
 
Inscription : décembre 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 20
Points : 9
Points : 9
Enleve le $ sur la ligne du while

"more +2 geom_to_check | while read line"
arso91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 11h48   #3
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 974
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 974
Points : 5 965
Points : 5 965
Salut.

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

Code :
1
2
3
4
for i in `commande`
do
      # traitements avec $i
done
Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 11h52   #4
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 142
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 142
Points : 33
Points : 33
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.
Erlen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 12h00   #5
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 142
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 142
Points : 33
Points : 33
Alors maintenant j'ai un autre soucis, il s'arrête pas à la fin du fichier.
Erlen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 12h07   #6
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 974
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 974
Points : 5 965
Points : 5 965
Toujours avec while ?

Si oui tu peut faire comme ceci

Code :
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).
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 12h24   #7
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 142
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 142
Points : 33
Points : 33
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.
Erlen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 14h06   #8
Membre éclairé
 
Homme Lilian Herault
Architecte technique
Inscription : juin 2010
Messages : 215
Détails du profil
Informations personnelles :
Nom : Homme Lilian Herault
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : Industrie

Informations forums :
Inscription : juin 2010
Messages : 215
Points : 335
Points : 335
Bonjour,

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

Essais avec ceci:

Code :
1
2
 
commande |{ while read line ; do echo "$line" ; done }

Lilian.
lilian_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 14h53   #9
Invité régulier
 
Inscription : décembre 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 20
Points : 9
Points : 9
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 :
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 |.
arso91 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2011, 15h03   #10
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 142
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 142
Points : 33
Points : 33
oui chez moi aussi ça fonctionne bien
Erlen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 16h49   #11
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
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 : 3 534
Points : 7 741
Points : 7 741
ça fonctionnera toujours sur KSH et BASH
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2011, 18h02   #12
Membre éclairé
 
Homme Lilian Herault
Architecte technique
Inscription : juin 2010
Messages : 215
Détails du profil
Informations personnelles :
Nom : Homme Lilian Herault
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : Industrie

Informations forums :
Inscription : juin 2010
Messages : 215
Points : 335
Points : 335
Alors ... désolé, chez moi ça ne fonctionne pas.

Lilian.
lilian_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 18h08   #13
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 974
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 974
Points : 5 965
Points : 5 965
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 :
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
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 20h55   #14
Membre éclairé
 
Homme Lilian Herault
Architecte technique
Inscription : juin 2010
Messages : 215
Détails du profil
Informations personnelles :
Nom : Homme Lilian Herault
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : Industrie

Informations forums :
Inscription : juin 2010
Messages : 215
Points : 335
Points : 335
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.
lilian_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 21h06   #15
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 974
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 974
Points : 5 965
Points : 5 965
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 :
[ ~] cat fichier | while read ligne; do echo $ligne; done;
D'où mes précédentes questions.

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 21h13   #16
Membre éclairé
 
Homme Lilian Herault
Architecte technique
Inscription : juin 2010
Messages : 215
Détails du profil
Informations personnelles :
Nom : Homme Lilian Herault
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : Industrie

Informations forums :
Inscription : juin 2010
Messages : 215
Points : 335
Points : 335
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.
lilian_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 21h16   #17
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 974
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 974
Points : 5 965
Points : 5 965
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).
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 21h37   #18
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 064
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 064
Points : 4 125
Points : 4 125
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 :
1
2
3
cat monFichier | while read line; do [ -z "$premLine" ] && premLine="$line"; done
echo "${premLine:-rien}"
rien
mais
Code :
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 :
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
N_BaH est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2011, 21h45   #19
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 974
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 974
Points : 5 965
Points : 5 965
N_BaH le roi du Bash a parlé

pour tes explications.
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 22h52   #20
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 142
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 142
Points : 33
Points : 33
@ 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 !
Erlen est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h39.


 
 
 
 
Partenaires

Hébergement Web