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 20/05/2011, 12h10   #1
Candidat au titre de Membre du Club
 
Homme Boris Couturier
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Boris Couturier
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 21
Points : 10
Points : 10
Par défaut variables locales, variables globales

Bonjour, j'ai cette ligne en shell sur freeBSD:
Code :
sed -n "/CUNIT_RUN_SUMMARY/,$"p ${curent} | while read ligne; do
dans la boucle j'utilise des variables, qui ne sont plus visibles une fois en dehors de la boucle, il semblerait que ce soit à cause du pipe, mes variables ne sont visibles que dans le while qui est un nouveau processus.
N'y à-t-il pas un moyen de récupérer mes variables hors du while ?
(j'ai essayer export, ou faire des set avant le while, mais ça ne fonctionne pas mieux)

Merci
boris_couturier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 12h31   #2
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
tu veux pas mettre plus d'infos ? plus de détails sur ton script ?
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/05/2011, 13h23   #3
Candidat au titre de Membre du Club
 
Homme Boris Couturier
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Boris Couturier
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 21
Points : 10
Points : 10
En résumé, ça donne quelque chose comme ça (d'abord quelques infos):
"liste contient" le resultat de qq ls ect, en gros, une liste sur des fichiers xml.
"nom_balise" et le nom de la balise de la ligne courante du fichier xml
"valeur" est la valeur contenu dans les balises xml.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
for curent in $liste; do
    sed -n "/CUNIT_RUN_SUMMARY/,$"p ${curent} | while read ligne; do
 
        # xml balise name
	nom_balise=`echo "$ligne" | sed 's#>.*##;s#<##'`
	# xml balise value
	valeur=`echo "$ligne" | sed 's#</.*##;s#.*>##' | sed 's#\ ##g'`
        ...
        run_suites=$valeur 
    done
done
 
echo "$run_suites"
voila par exemple ce que je voudrais pouvoir faire.
(bien entendu je ne fais pas juste un echo de la variables tel quel, et je ne peux pas le faire à l'intérieur de la boucle while)
boris_couturier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 13h25   #4
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Y'a peut-être moyen de ne pas utiliser le pipe...

Exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> cat whiletest2
#!/bin/sh
VAR=foo

cat $0 | while read VAR2; do
   VAR=bar
done

echo $VAR
> cat whiletest
#!/bin/sh
VAR=foo

while read VAR2; do
   VAR=bar
done < $0

echo $VAR
> ./whiletest2
foo
> ./whiletest
bar
>
Mais il faudrait mettre le résultat du sed dans un fichier temporaire je ne sais pas si ça te conviendra...
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 13h31   #5
Candidat au titre de Membre du Club
 
Homme Boris Couturier
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Boris Couturier
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 21
Points : 10
Points : 10
J'y avais pensé, mais je préfère eviter.
Enfin si je dis ça c'est uniquement par soucis de perf, mais je sais pas du tout en shell si c'est vraiment plus lourd d'écrire et lire dans un fichier temp (sachant que le resultat du sed doit faire plus ou moins 30 lignes à chaques fois)
boris_couturier est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/05/2011, 13h38   #6
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Ou alors évite le while read qui suxe mégadur :

Code :
1
2
3
4
5
6
7
OFS="${IFS}"
IFS='
'
for ligne in $(sed -n "/CUNIT_RUN_SUMMARY/,$"p ${curent}); do
    etc...
done
IFS="${OFS}"
[EDIT] Je dis ça je dis rien mais current prend deux « r »
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 13h56   #7
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Sinon ça ce serait mieux non ?
Code :
1
2
3
4
5
6
7
8
for curent in $liste; do
	nom_balise=$(sed '/CUNIT_RUN_SUMMARY/s#>.*##;s#<##' "${curent}")
	# xml balise value
	valeur=$(sed '/CUNIT_RUN_SUMMARY/s#</.*##;s#.*>##' | sed 's#\ ##g' "${curent}")
        ...
        run_suites=$valeur 
        echo "$run_suites"
done
J'ai pas vraiment testé (un petit peu, ça semble faire ce que tu veux a priori).
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 13h58   #8
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Côté perf, ça devrait pas poser de problème.

En supposant que ton code est plus intéressant que ton exemple qui écrase à chaque ligne la variable $run_suites (à moins que cela ne soit le week-end qui arrive qui me fatigue ), et que tu ne peux donc pas trop modifier sa structure, est-ce que tu ne pourrais pas t'en sortir en regroupant tes commandes ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$ cat whiletest2
#!/bin/sh
VAR=foo

cat $0 | ( while read VAR2; do
   VAR=bar
done

echo $VAR
)
$ ./whiletest2
bar
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/05/2011, 14h02   #9
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

en ne fait, pour l'instant, que supposer que tu n'utilises pas BASH, est-ce vrai ?
alors, pourquoi pas :
Code :
1
2
3
4
5
var=$(echo "foo bar
bla baz" | while read a b; do echo "$a"; done)
echo "$var"
foo
bla
sinon, la commande sed n'est pas nécessaire.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 14h04   #10
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 743
Points : 7 743
évites de faire aussi ... mais ça c'est juste pour optimiser les perfs....
sed sait gérer les commandes multiples .... en séquence forcément mais même sur résultat d'une commande sed précédente....

et enfin ne fais pas un mais un
Code :
while..... done < fichier
ou un
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 14h04   #11
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Citation:
Envoyé par Alek-C Voir le message
Côté perf, ça devrait pas poser de problème.

En supposant que ton code est plus intéressant que ton exemple qui écrase à chaque ligne la variable $run_suites (à moins que cela ne soit le week-end qui arrive qui me fatigue ), et que tu ne peux donc pas trop modifier sa structure, est-ce que tu ne pourrais pas t'en sortir en regroupant tes commandes ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$ cat whiletest2
#!/bin/sh
VAR=foo

cat $0 | ( while read VAR2; do
   VAR=bar
done

echo $VAR
)
$ ./whiletest2
bar
Sympa l'astuce j'aurais pas pensé, merci.

BSD y'a bash ou pas ? je connais pas du tout personnellement...



Et bon c'est pas pour en rajouter hein ^^ mais :

Citation:
Envoyé par boris_couturier Voir le message
"liste" contient le resultat de qq ls ect,
Citation:
Envoyé par boris_couturier Voir le message
for current in $liste; do ...
En gros ça nous donne un beau for in $(ls)... aie !

Y'a un problème conceptuel là.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 14h15   #12
Candidat au titre de Membre du Club
 
Homme Boris Couturier
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Boris Couturier
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 21
Points : 10
Points : 10
Citation:
En supposant que ton code est plus intéressant que ton exemple qui écrase à chaque ligne la variable $run_suites (à moins que cela ne soit le week-end qui arrive qui me fatigue ), et que tu ne peux donc pas trop modifier sa structure, est-ce que tu ne pourrais pas t'en sortir en regroupant tes commandes ?
Oui je te rassure, cette variable ne sera définie qu'une seule fois et je n'en ai plus besoin hors du while, par contre je fais aussi un truc du genre
Code :
let "total_suites=$total_suites+$run_suites"
et j'ai besoin de total_suites hors du wihle.

Citation:
Ou alors évite le while read qui suxe mégadur :

for ligne in $(sed -n "/CUNIT_RUN_SUMMARY/,$"p ${curent}); do
etc...
done

[EDIT] Je dis ça je dis rien mais current prend deux « r »
en effet current prend 2 r...
et j'ai déjà fait quelque chose comme ça au début, mais le xml est structuré comme ça: <BALISE> valeur </BALISE> et le for me fait 3 lignes là dessus, car il sépare sur les espaces.

Citation:
Sympa l'astuce j'aurais pas pensé, merci.

BSD y'a bash ou pas ? je connais pas du tout personnellement...
oui, il y a moyen de l'avoir avec quelque chose comme ça me semble: #!/usr/local/bin/bash

frp31, pourquoi il est mieux d’éviter le ... | while ?
(et je pars sur un while ... done < fichier, mais je voulais juste éviter le fichier temporaire, mais tant pis.)
boris_couturier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 14h17   #13
Candidat au titre de Membre du Club
 
Homme Boris Couturier
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Boris Couturier
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 21
Points : 10
Points : 10
Citation:
Envoyé par FRUiT Voir le message
Et bon c'est pas pour en rajouter hein ^^ mais :




En gros ça nous donne un beau for in $(ls)... aie !

Y'a un problème conceptuel là.
Ah bon ? x) je suis pas expert du tout en shell, pourquoi ça ne va pas ?
boris_couturier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 14h18   #14
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Citation:
Envoyé par boris_couturier Voir le message
et j'ai deja fait quelque chose comme ça au debut, mais le xml est structuré comme ça: <BALISE> valeur </BALISE> et le for me fait 3 lignes la dessus, car il sépare sur les espaces.
Ben oui mais je change l'IFS exprès pour ça, pour découper selon les sauts de ligne et non les espaces. Tu devrais essayer...

Cela dit ça reste du bricolage.


Citation:
Envoyé par boris_couturier Voir le message
Ah bon ? x) je suis pas expert du tout en shell, pk ça va pas ?
Parce que ls ne donne pas une liste de fichiers, mais une représentation textuelle de noms de fichiers. Je cherche le blog qui en parle je trouve plus...
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 14h35   #15
Candidat au titre de Membre du Club
 
Homme Boris Couturier
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Boris Couturier
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 21
Points : 10
Points : 10
Ok, bon à savoir, c'est vrai qu'en y pensant, ls ne fait qu'afficher des noms.
Mais ça existe en shell des variables autres que textuelles ? x)

Sinon avec le IFS, ça fonctionne bien (je l'avais juste un peu mal placé, mais maintenant c'est bon) j'ai plus mon pipe, et j'ai plus mon while qui sux (ça je sais pas non plus pourquoi d'ailleurs)

Merci pour les réponses
(j'ai essayé ta méthode Alex, c'est une bonne idée, mais dans mon cas, je pense pas pouvoir l'utiliser, mon while se trouvait dans un for, et j'avais besoin de mes variables hors de ce for)

Code :
1
2
3
4
5
6
7
8
9
10
 
for....
    ... | ( while
        ...
    done
    ...
    )
done
 
# j'ai besoin de mes variables ici
Je sais pas du tout si il est possible de mettre en parenthèse le for, juste comme ça, ,si ça l'est ça aurait fonctionné dans mon cas aussi ^
boris_couturier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 15h01   #16
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
J'ai retrouvé le lien qui explique pourquoi ne pas parser ls :

http://mywiki.wooledge.org/ParsingLs

Et aussi une page très intéressante :

http://mywiki.wooledge.org/BashPitfalls

(lire notamment le premier chapitre)
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 15h06   #17
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
A mon avis, tu devrais pouvoir simplifier ton script...

Je ne dirais pas que mon idée est bonne; c'est juste bon à savoir et ça peut permettre de dépanner, mais ça n'est pas super propre (c'est d'ailleurs la seule de la page à avoir un vote négatif , dommage que je ne sache pas pourquoi).

A mon avis, je pense que tu as plutôt soit un problème d'organisation de ton script, soit tu ne devrais pas utiliser le shell qui est peut être trop limité pour ce que tu cherches à faire ?
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/05/2011, 15h35   #18
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par FRUiT Voir le message
J'ai retrouvé le lien qui explique pourquoi ne pas parser ls :

http://mywiki.wooledge.org/ParsingLs

Et aussi une page très intéressante :

http://mywiki.wooledge.org/BashPitfalls

(lire notamment le premier chapitre)
Génial ce site
Pour info :
http://mywiki.wooledge.org/BashFAQ/024
Ca ressemble vachement au problème
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 15h37   #19
Candidat au titre de Membre du Club
 
Homme Boris Couturier
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Boris Couturier
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 21
Points : 10
Points : 10
Perso, je trouve le shell de base pas super propre, vu ce qu'on peut faire avec, Mais (je le répète encore) je m'y connais pas assez pour affirmer ça.

Sinon, je l'ai déjà simplifié par rapport à avant (où j'avais 2 boucles for quasi identiques à part que la liste des fichiers était dans un dossier différent...)

En gros ce que ce script fait, il cherche dans 2 répertoires (et dans des sous-répertoires, ect...) des fichiers avec une extension .xml, puis quand il à la liste, il lit chaque fichier xml à partir d'une certaine ligne pour piocher des infos particulières, et à la fin générer un .xml global résumant les infos de tous les fichiers xml trouvés.
boris_couturier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 15h56   #20
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
pour le traitement de fichiers XML, il y a XSLT
N_BaH 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 16h15.


 
 
 
 
Partenaires

Hébergement Web