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 :

Boucle for appelant plusieurs variables


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    autres
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autres
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut Boucle for appelant plusieurs variables
    Bonjour à tous,

    Je bloque depuis plusieurs jours sur un problème de boucle for. Je précise que j'ai cherché une réponse sur internet et sur le forum, mais je ne sais pas à quoi correspond (à quel nom ?) ce que je veux faire c'est difficile.

    Je fais des boucles for qui marchent bien. Mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    var1="HIPPOCAMPE_DROIT"
    var2=hippo_d
    var3=17
     
    echo = ${var1}
     
    for filename in 'cat list.txt' ; 
    do fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var3} -thr ${var3} ${filename}_conv/rois/${filename}_${var2} ; 
    done
     
    var1="HIPPOCAMPE_GAUCHE"
    var2=hippo_g
    var3=16
    echo = ${var1}
     
    for filename in 'cat list.txt' ; 
    do fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var3} -thr ${var3} ${filename}_conv/rois/${filename}_${var2} ; 
    done
    En fait comme chaque boucle appelle plusieurs variables (var1, var2 et var3), je fais des copié / coller et comme j'ai une centaine de boucle ça devient vite très très long.

    Je cherche donc un moyen d'automatiser tout ça en faisant une sorte de boucle dans la boucle pour ne pas avoir à faire de copié coller de ma boucle for filename in 'cat list.txt'....

    De façon alternative, j'ai pensé à créer un script qui s'appellerait ./script1 et qui contiendrait la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for filename in 'cat list.txt' ; 
    do fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var3} -thr ${var3} ${filename}_conv/rois/${filename}_${var2} ; 
    done
    et ensuite j'aurai pensé faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    var1="HIPPOCAMPE_DROIT"
    var2=hippo_d
    var3=17
     
    echo = ${var1}
     
    ./script1
     
    var1="HIPPOCAMPE_GAUCHE"
    var2=hippo_g
    var3=16
    echo = ${var1}
     
    ./script1
    Le problème c'est que cette option ne marche pas, parce que les variables que je définie ne sont pas prise en compte dans mon script ./script1.

    C'est très dommage parce que cette solution aurait été pratique. En fait ça ne me dérange pas d'écrire à chaque fois la définition des variables var1, var2 et var3, le problème c'est que j'ai tellement de boucles qu'au final je ne peux pas me permettre de faire des copié / collé de ma boucle for à chaque fois (d'autant plus qu'en réalité j'ai plusieurs boucles for pour chaque valeur de var1, var2 et var3.

    Je précise par ailleurs que mon triplé de variable var1, var2 et var3 sont toujours associés de la même manière.

    Merci beaucoup pour votre aide,

    Je me dis qu'il doit y avoir une solution simple. Toute idée est la bienvenue.

    Bonne soirée,

    Charles

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Bonjour,

    Si au lieu de passer par un script intermédiaire, tu créais une fonction qui contient ta boucle ?

    Cela donnerait quelque chose comme ci-dessous (pas testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/usr/bin/bash
    # On déclare la fonction
    func1 () 
    { 
        for filename in $(cat list.txt)
        do
            fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var3} -thr ${var3} ${filename}_conv/rois/${filename}_${var2}
        done
    }
     
    #puis, on utilise celle-ci
    var1="HIPPOCAMPE_DROIT"
    var2=hippo_d
    var3=17
     
    echo = ${var1}
     
    func1
     
    var1="HIPPOCAMPE_GAUCHE"
    var2=hippo_g
    var3=16
    echo = ${var1}
     
    func1
    Sinon, pour information, ton script peut prendre en compte tes variables si celles-ci ont été exporté au préalable.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour,

    tout d'abord, on ne lit pas un fichier avec une boucle for : Comment parcourir un fichier.

    ensuite, est-ce que le script doit être portable, ou peut-il utiliser des tableaux.
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ tablx=( t1 t2 )                                                                                                             
    $ declare -A tabl=( [t1]='a b c' [t2]='d e f' )                                                                               
    $ for t in "${tablx[@]}"; do ar=( ${tabl[$t]} ); echo "jeu de valeurs #$((++n)) :";printf '%s\n' "${ar[@]}"; done             
    jeu de valeurs #1 :
    a
    b
    c
    jeu de valeurs #2 :
    d
    e
    f
    ce serait, à mes yeux, la meilleure solution.

    sinon, tu peux passer tes variables à ton script en tant qu'arguments, mais ça va être lourd.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par charleslaidi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for filename in 'cat list.txt' ;
    j'imagine qu'il y a une erreur de typo ou de copier/coller ici, ça ne peut fonctionner que si tu utilises des backquotes `` et non des simple quotes ''

    De façon alternative, j'ai pensé à créer un script qui s'appellerait ./script1 (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var1="HIPPOCAMPE_DROIT"
    (...)
    ./script1
    c'était pas bête comme idée (c'est pas hyper sex mais ça aurait pu te permettre de contourner la difficulté), ça aurait pu marcher en sourçant le script plutôt qu'en l'exécutant tel quel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    source ./script1
    # ou
    . ./script1  # ca revient au même
    de cette façon script1 est littéralement inclu dans le script appelant et les variables sont disponibles lorsqu'il déroule

    maintenant je te propose une solution plus "propre" (sans for i in `cat f`, y'en a qui ont essayé, maintenant leurs oreilles ornent les colliers de certains membres de ce forum ), à base de boucle while imbriquées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read var1 var2 var3; do
       while read filename; do
          fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var3} -thr ${var3} ${filename}_conv/rois/${filename}_${var2}
       done < list.txt
    done < variables.txt
    et le fichier variables.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HIPPOCAMPE_DROIT hippo_d 17
    HIPPOCAMPE_GAUCHE hippo_g 16
    edit: le temps de rédiger me suis fais pris de vitesse ^^

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par charleslaidi Voir le message
    De façon alternative, j'ai pensé à créer un script qui s'appellerait ./script1 et qui contiendrait la boucle :
    Pour factoriser, tu peux effectivement faire un script auxiliaire.

    Dans ce cas, comme indiqué par disedorgue, il te suffit de mettre, une seule fois, au début du script appelant export var1 var2 var3.

    Mais les variables exportées ne sont pas la seule manière de communiquer avec un script auxiliaire, il y a aussi les arguments fournis à l'appel.

    Et le script auxiliaire n'est pas la seule manière de factoriser le code, il y a aussi, comme indiqué également par disedorgue, les sous-fonctions.

    Et les variables visibles ne sont pas la seule manière de communiquer avec une sous-fonction, il y a aussi les paramètres.

    Comme tu n'indiques pas d'où tu tiens les valeurs des variables var1 var2 var3, ni si tu as besoin de les utiliser pour autre chose que l'appel à fsl4.1-fslmaths, il est difficile de savoir quelle est la meilleure solution.

    J'aime beaucoup la proposition de BufferBob, mais on ne voit pas les valeurs utilisées pour var1 var2 et var3 car elles sont dans le fichier de données.

    Ma proposition est donc la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/sh
     
    # La fonction qui fait le boulot et attend 3 arguments:
    # 1 : Le libellé du machin (région du cerveau?), qui est juste affiché
    # 2 : Le nom abrégé du machin (utilisé pour le suffixe des fichiers générés)
    # 3 : La valeur du bidule (utilisée pour uthr et thr)
    function fsl {
      echo "= ${1}"
      while read filename; do
        fsl4.1-fslmaths "${filename}_conv/mri/aseg_raw.nii.gz" -uthr ${v3} -thr ${3} "${filename}_conv/rois/${filename}_${2}"
      done < list.txt
    }
     
    # Les appels de la fonction:
    fsl "HIPPOCAMPE_DROIT"  hippo_d 17
    fsl "HIPPOCAMPE_GAUCHE" hippo_g 16
    etc.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par charleslaidi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    var1="HIPPOCAMPE_DROIT"
    var2=hippo_d
    var3=17
     
    echo = ${var1}
     
    for filename in 'cat list.txt' ; 
    do fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var3} -thr ${var3} ${filename}_conv/rois/${filename}_${var2} ; 
    done
     
    var1="HIPPOCAMPE_GAUCHE"
    var2=hippo_g
    var3=16
    echo = ${var1}
     
    for filename in 'cat list.txt' ; 
    do fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var3} -thr ${var3} ${filename}_conv/rois/${filename}_${var2} ; 
    done
    En fait comme chaque boucle appelle plusieurs variables (var1, var2 et var3), je fais des copié / coller et comme j'ai une centaine de boucle ça devient vite très très long.

    Je cherche donc un moyen d'automatiser tout ça en faisant une sorte de boucle dans la boucle pour ne pas avoir à faire de copié coller de ma boucle for filename in 'cat list.txt'....
    Je me dis qu'il doit y avoir une solution simple. Toute idée est la bienvenue.
    Bonjour

    Faire un second script qui aurait connaissance de tes variables via un export est bien entendu possible mais c'est dommage d'avoir deux scripts distincts pour faire un seul travail (sous-entendu le second script n'étant pas utilisé ailleurs) alors qu'on peut toujours faire autrement. Comme par exemple mettre ta boucle for() dans une fonction séparée.

    Ceci dit, on peut aussi faire sans. A priori, la seule chose qui change c'est var3 qui descend d'un indice à chaque étape. Tu peux peut-être exploiter ce fait
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var1="HIPPOCAMPE_GAUCHE"
    var2=hippo_g
    for var3 in $(seq 20 |tac); do
        cat list.txt |while read filename ; do
            fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var3} -thr ${var3} ${filename}_conv/rois/${filename}_${var2} ; 
        done
    done

    Si maintenant tu veux faire évoluer plusieurs variables en parallèle, c'est possible en trichant un peu avec le set qui ira remplir $* et en utilisant alors les paramètres positionnels $1, $2, .... Exemple:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
     
    set 1 2 3 4 5 6 7 8 9
    while test $# -gt 0; do
       echo $1 $2 $3
       shift 3
    done

    Et si tu ne veux pas perdre ton $* originel, alors il reste quand-même ce qui pourrait s'apparenter à de la sérialisation: concaténer tes valeurs à traiter avec un séparateur particulier puis découper chaque concaténation. Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    liste="papa ours;brun;180:maman ours;blonde;120:bébé ours;blanc;10"
     
    echo "$liste" |sed -e "s/:/\n/g" |while read info
    do
    	nom=$(echo "$info" |cut -f1 -d\;)
    	couleur=$(echo "$info" |cut -f2 -d\;)
    	poids=$(echo "$info" |cut -f3 -d\;)
    	echo "nom: [$nom], poids: [$poids], couleur: [$couleur]"
    done
    Comme quoi, si les données entrantes sont reconnaissables par un critère quelconque, il y a alors toujours une solution pour l'exploiter...
    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]

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Bonjour,

    Citation Envoyé par Sve@r Voir le message
    Et si tu ne veux pas perdre ton $* originel, alors il reste quand-même ce qui pourrait s'apparenter à de la sérialisation: concaténer tes valeurs à traiter avec un séparateur particulier puis découper chaque concaténation. Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    liste="papa ours;brun;180:maman ours;blonde;120:bébé ours;blanc;10"
     
    echo "$liste" |sed -e "s/:/\n/g" |while read info
    do
    	nom=$(echo "$info" |cut -f1 -d\;)
    	couleur=$(echo "$info" |cut -f2 -d\;)
    	poids=$(echo "$info" |cut -f3 -d\;)
    	echo "nom: [$nom], poids: [$poids], couleur: [$couleur]"
    done
    Comme quoi, si les données entrantes sont reconnaissables par un critère quelconque, il y a alors toujours une solution pour l'exploiter...
    Pour ne pas perdre son $* originel, on ne pourrait pas le sauvegarder "simplement" ?
    C'est une vraie question, à cause du critère positionnel: set "foo bar" foobar va créer juste 2 variables positionnelle ($1 et $2), et la question est de savoir s'il est possible de sauver celles-ci simplement, genre XX=$* ou XX=$@ et nom pas via une boucle ?

    Sinon, concernant le petit script final, sous bash, il est amplement simplifiable:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
     
    liste="papa ours;brun;180:maman ours;blonde;120:bébé ours;blanc;10"
     
    echo "$liste" |while IFS=\; read -d ':' nom couleur poids
    do
    	echo "nom: [$nom], poids: [$poids], couleur: [$couleur]"
    done

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pour ne pas perdre son $* originel, on ne pourrait pas le sauvegarder "simplement" ?
    Tout à fait. svg="$*" et set $svg à la fin. Ca fonctionne sauf si on a besoin de $* dans la boucle

    Citation Envoyé par disedorgue Voir le message
    Sinon, concernant le petit script final, sous bash, il est amplement simplifiable:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
     
    liste="papa ours;brun;180:maman ours;blonde;120:bébé ours;blanc;10"
     
    echo "$liste" |while IFS=\; read -d ':' nom couleur poids
    do
    	echo "nom: [$nom], poids: [$poids], couleur: [$couleur]"
    done
    Oui mais j'aime pas toucher à l'IFS quand je peux éviter. Trop dangereux comme manip. Et quand (contraint et forcé) je m'y résigne, je le sauvegarde et le restore immédiatement après la manip que je veux la plus courte possible du genre svg="$IFS"; IFS="..."; set ...; IFS="$svg". Avoir toute une boucle avec l'IFS qui ne contient plus ses valeurs d'origine m'embête énormément.
    Mais on a tous nos petites habitudes
    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]

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Non,

    svg="$*" puis set $svg ne fonctionne pas dans tous les cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ set "foo bar" "foobar"
    $ echo $1
    foo bar
    $ echo $2
    foobar
    $ svg="$*"
    $ set $svg
    $ echo $1
    foo
    $ echo $2
    bar
    $ echo $3
    foobar
    Et je posais la question de savoir si c'était possible de les sauver simplement.

    Concernant l'IFS, je suis d'accord avec toi, sauf que dans l'exemple que je donne, l'IFS n'est modifié que pour la commande read qui suit la redéfinition et uniquement elle.

  10. #10
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Il est possible sauvegarder la liste des arguments même quand ils contiennent des espaces ou autres caractères de l'IFS comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ set "a b" c
    $ echo $1
    a b
    $ arguments=( "$@" )
    $ set x y z
    $ echo $1
    x
    $ set "${arguments[@]}"
    $ echo $1
    a b

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Concernant l'IFS, je suis d'accord avec toi, sauf que dans l'exemple que je donne, l'IFS n'est modifié que pour la commande read qui suit la redéfinition et uniquement elle.
    Exact et je n'en comprends pas trop la raison. Est-ce parce qu'il n'y a aucun séparateur d'instruction entre l'affectation de l'IFS et le read ???
    Ceci dit, en testant je viens de me rendre compte que ça ne lit pas le dernier enregistrement (bébé ours). Il faut terminer la liste par le séparateur read pour que ça fonctionne => liste="papa ours;brun;180:maman ours;blonde;120:bébé ours;blanc;10:"...
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Est-ce parce qu'il n'y a aucun séparateur d'instruction entre l'affectation de l'IFS et le read ???
    oui, on définit ainsi la variable environnementale de read, comme on le ferait avec n'importe quelle variable pour n'importe quelle commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ maFonc(){ echo "$maVar";}
    $ unset maVar; maVar=bla maFonc                                                                                                                          
    bla
    $ echo ${maVar:-"n'existe pas dans l'environnement courant"}
    n'existe pas dans l'environnement courant
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ceci dit, en testant je viens de me rendre compte que ça ne lit pas le dernier enregistrement (bébé ours). Il faut terminer la liste par le séparateur read pour que ça fonctionne => liste="papa ours;brun;180:maman ours;blonde;120:bébé ours;blanc;10:"...
    C'est vrai, une solution possible, pour ne pas imposer de le mettre systématiquement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo "${liste%*:}:" | while IFS=\; read -d ':' nom couleur poids
    do
        echo "nom: [$nom], poids: [$poids], couleur: [$couleur]"
    done
    Ou une syntaxe sans le pipe ("|") afin de ne pas passer par un sous-shell, ce qui peut-être pratique quand on désire initialiser des variables pour plus tard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while IFS=\; read -d ':' nom couleur poids
    do
        echo "nom: [$nom], poids: [$poids], couleur: [$couleur]"
    done <<<"${liste%*:}:"

  14. #14
    Membre habitué
    Homme Profil pro
    autres
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autres
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut Poursuite du problème
    Bonjour à tous,

    Tout d'abord merci pour toutes vos réponses ! J'ai beaucoup appris...

    En fait j'ai été très intéressé par la réponse de BufferBob, et je l'ai combinée avec le proposition de Disedorgue (en utilisant une fonction).

    J'ai donc écris le script suivant suivante (effectivement c'est pour traiter des images de cerveau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    function1 ()
    {
    echo EXTRACTION DU ${var1}
     
    for filename in `cat list.txt` ; 
    do fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var2} -thr ${var2} ${filename}_conv/rois/${filename}_${var1}  
    done
     
    for filename in `cat list.txt` ; 
    do fsl4.1-fslmaths ${filename}_conv/rois/${filename}_${var1}.nii.gz -div ${var2} ${filename}_conv/rois/${filename}_${var1}_div 
    done
     
    for filename in `cat list.txt` ; 
    do mri_convert ${filename}_conv/rois/${filename}_${var1}_div.nii.gz ${filename}_conv/rois/${filename}_${var1}_div_conv.nii
    done
     
    echo TRANSFERT DE LA ROI ${var1} DANS LE DOSSIER 
     
    for filename in `cat list.txt` ; 
    do cp ${filename}_conv/rois/${filename}_${var1}_div_conv.nii /$SPTH2/${filename}/mask_charles
    done
     
    for filename in `cat list.txt` ; 
    do AimsFileConvert /$SPTH2/${filename}/mask_charles/${filename}_${var1}_div_conv.nii /$SPTH2/${filename}/mask_charles/${var1}.ima
    done
     
    echo ${var1} TERMINE
    }
     
    # créer un fichier list.txt avec la liste des noms du sujet
    # créer un fichier variables tel que : var1 =  cereb_g_wm et var2 = 17 (ou 17 = numéro de la LUT de FreeSufer)
     
    while read var1 var2; do
        while read filename; do
            function1
        done < list.txt
    done < variables.txt
    Au départ j'était content parce que ça me donnait le résultat que j'espérais. Sauf qu'en regardant plus précisément dans le terminal, je me suis rendu compte de quelque chose d'étrange :
    - Le script donne le résultat voulu
    - Mais en fait il tourne deux fois, (la seconde fois, le fichier qui doit être crée est écrasé j'ai l'impression)
    - Ensuite il tourne deux fois en foirant, et ce qui se passe c'est que la variable var1 ne peut pas être lue, donc je reste à extraction de (et rien ensuite).

    Du coup ça m'ennuie un peu que le script marche mais qu'il y ait des erreurs dans le terminal.
    Je pense qu'il doit y avoir un problème avec le read var1 var2, et qu'en fait il fait des itérations pour chaque "filename" alors qu'il ne devrait pas.

    Je en sais pas si vous avez une idée du problème ?

    Merci beaucoup pour votre aide,

    Charles

    PS : je vous mets au cas ou ce que j'ai dans le terminal :
    PS 2 : il y a des chiffres (un deux trois etc..) dans le terminal, qui correspondent à des echo que j'avais mis pour voir là ou était le problème.
    le filename est remplacé par "nom_du_sujet"

    mkdir: impossible de créer le répertoire «/lab/lab2/Di/martin/mon_nom/pilot_freesurfer/nom_du_sujet_conv/rois»: Le fichier existe
    mri_convert -rl nom_du_sujet_conv/mri/rawavg.mgz -rt nearest nom_du_sujet_conv/mri/aseg.mgz nom_du_sujet_conv/mri/aseg_raw.nii.gz
    $Id: mri_convert.c,v 1.179.2.7 2012/09/05 21:55:16 mreuter Exp $
    reading from nom_du_sujet_conv/mri/aseg.mgz...
    TR=2300.00, TE=0.00, TI=0.00, flip angle=0.00
    i_ras = (-1, 0, 0)
    j_ras = (0, 0, -1)
    k_ras = (0, 1, 0)
    reading template info from volume nom_du_sujet_conv/mri/rawavg.mgz...
    changing data type from uchar to float (noscale = 0)...
    Reslicing using nearest
    writing to nom_du_sujet_conv/mri/aseg_raw.nii.gz...
    EXTRACTION DU cereb_g_wm
    un
    deux
    trois
    mri_convert nom_du_sujet_conv/rois/nom_du_sujet_cereb_g_wm_div.nii.gz nom_du_sujet_conv/rois/nom_du_sujet_cereb_g_wm_div_conv.nii
    $Id: mri_convert.c,v 1.179.2.7 2012/09/05 21:55:16 mreuter Exp $
    reading from nom_du_sujet_conv/rois/nom_du_sujet_cereb_g_wm_div.nii.gz...
    TR=2300.00, TE=0.00, TI=0.00, flip angle=0.00
    i_ras = (0, -1, 0)
    j_ras = (0, 0, 1)
    k_ras = (1, 0, 0)
    writing to nom_du_sujet_conv/rois/nom_du_sujet_cereb_g_wm_div_conv.nii...
    quatre
    TRANSFERT DE LA ROI cereb_g_wm DANS LE DOSSIER LOGICIEL
    cinq
    six
    filein : //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/nom_du_sujet_cereb_g_wm_div_conv.nii
    fileout : //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/cereb_g_wm.ima
    encoding: Binary
    normal : 0
    rescale : 0
    format :
    type :
    objtype :
    xdim : 0
    ydim : 0
    zdim : 0
    imin : default
    imax : default
    omin : default
    omax : default
    reading //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/nom_du_sujet_cereb_g_wm_div_conv.nii as Volume / FLOAT...
    reading done
    convert to Volume / FLOAT
    converting data...
    convert done
    writing //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/cereb_g_wm.ima...
    done
    sept
    cereb_g_wm TERMINE
    huit
    EXTRACTION DU cereb_g_wm
    un
    deux
    trois
    mri_convert nom_du_sujet_conv/rois/nom_du_sujet_cereb_g_wm_div.nii.gz nom_du_sujet_conv/rois/nom_du_sujet_cereb_g_wm_div_conv.nii
    $Id: mri_convert.c,v 1.179.2.7 2012/09/05 21:55:16 mreuter Exp $
    reading from nom_du_sujet_conv/rois/nom_du_sujet_cereb_g_wm_div.nii.gz...
    TR=2300.00, TE=0.00, TI=0.00, flip angle=0.00
    i_ras = (0, -1, 0)
    j_ras = (0, 0, 1)
    k_ras = (1, 0, 0)
    writing to nom_du_sujet_conv/rois/nom_du_sujet_cereb_g_wm_div_conv.nii...
    quatre
    TRANSFERT DE LA ROI cereb_g_wm DANS LE DOSSIER LOGICIEL
    cinq
    six
    filein : //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/nom_du_sujet_cereb_g_wm_div_conv.nii
    fileout : //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/cereb_g_wm.ima
    encoding: Binary
    normal : 0
    rescale : 0
    format :
    type :
    objtype :
    xdim : 0
    ydim : 0
    zdim : 0
    imin : default
    imax : default
    omin : default
    omax : default
    reading //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/nom_du_sujet_cereb_g_wm_div_conv.nii as Volume / FLOAT...
    reading done
    convert to Volume / FLOAT
    converting data...
    convert done
    writing //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/cereb_g_wm.ima...
    done
    sept
    cereb_g_wm TERMINE
    huit
    EXTRACTION DU
    un
    deux
    ** ERROR (nifti_image_read): failed to find header file for 'nom_du_sujet_conv/rois/nom_du_sujet__div'
    ** ERROR: nifti_image_open(nom_du_sujet_conv/rois/nom_du_sujet__div): bad header info
    ERROR: failed to open file nom_du_sujet_conv/rois/nom_du_sujet__div
    ERROR: Could not open image nom_du_sujet_conv/rois/nom_du_sujet__div
    Image Exception : #22 :: Failed to read volume nom_du_sujet_conv/rois/nom_du_sujet__div
    terminate called after throwing an instance of 'RBD_COMMON::BaseException'
    ./Stk-FS-ROI : ligne 37 : 28003 Abandon fsl4.1-fslmaths ${filename}_conv/rois/${filename}_${var1}.nii.gz -div ${var2} ${filename}_conv/rois/${filename}_${var1}_div
    trois
    mri_convert nom_du_sujet_conv/rois/nom_du_sujet__div.nii.gz nom_du_sujet_conv/rois/nom_du_sujet__div_conv.nii
    $Id: mri_convert.c,v 1.179.2.7 2012/09/05 21:55:16 mreuter Exp $
    reading from nom_du_sujet_conv/rois/nom_du_sujet__div.nii.gz...
    niiRead(): error opening file nom_du_sujet_conv/rois/nom_du_sujet__div.nii.gz
    quatre
    TRANSFERT DE LA ROI DANS LE DOSSIER LOGICIEL
    cinq
    cp: impossible d'évaluer «nom_du_sujet_conv/rois/nom_du_sujet__div_conv.nii»: Aucun fichier ou dossier de ce type
    six
    filein : //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/nom_du_sujet__div_conv.nii
    fileout : //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/.ima
    encoding: Binary
    normal : 0
    rescale : 0
    format :
    type :
    objtype :
    xdim : 0
    ydim : 0
    zdim : 0
    imin : default
    imax : default
    omin : default
    omax : default
    /i2bm/local/Ubuntu-14.04-x86_64/brainvisa/bin/real-bin/AimsFileConvert: //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/nom_du_sujet__div_conv.nii : No such file or directory
    sept
    TERMINE
    huit
    EXTRACTION DU
    un
    deux
    ** ERROR (nifti_image_read): failed to find header file for 'nom_du_sujet_conv/rois/nom_du_sujet__div'
    ** ERROR: nifti_image_open(nom_du_sujet_conv/rois/nom_du_sujet__div): bad header info
    ERROR: failed to open file nom_du_sujet_conv/rois/nom_du_sujet__div
    ERROR: Could not open image nom_du_sujet_conv/rois/nom_du_sujet__div
    Image Exception : #22 :: Failed to read volume nom_du_sujet_conv/rois/nom_du_sujet__div
    terminate called after throwing an instance of 'RBD_COMMON::BaseException'
    ./Stk-FS-ROI : ligne 37 : 28016 Abandon fsl4.1-fslmaths ${filename}_conv/rois/${filename}_${var1}.nii.gz -div ${var2} ${filename}_conv/rois/${filename}_${var1}_div
    trois
    mri_convert nom_du_sujet_conv/rois/nom_du_sujet__div.nii.gz nom_du_sujet_conv/rois/nom_du_sujet__div_conv.nii
    $Id: mri_convert.c,v 1.179.2.7 2012/09/05 21:55:16 mreuter Exp $
    reading from nom_du_sujet_conv/rois/nom_du_sujet__div.nii.gz...
    niiRead(): error opening file nom_du_sujet_conv/rois/nom_du_sujet__div.nii.gz
    quatre
    TRANSFERT DE LA ROI DANS LE DOSSIER LOGICIEL
    cinq
    cp: impossible d'évaluer «nom_du_sujet_conv/rois/nom_du_sujet__div_conv.nii»: Aucun fichier ou dossier de ce type
    six
    filein : //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/nom_du_sujet__div_conv.nii
    fileout : //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/.ima
    encoding: Binary
    normal : 0
    rescale : 0
    format :
    type :
    objtype :
    xdim : 0
    ydim : 0
    zdim : 0
    imin : default
    imax : default
    omin : default
    omax : default
    /i2bm/local/Ubuntu-14.04-x86_64/brainvisa/bin/real-bin/AimsFileConvert: //lab/lab2/Di/martin/mon_nom/pilot_logiciel//nom_du_sujet/mask_mon_nom/nom_du_sujet__div_conv.nii : No such file or directory
    sept
    huit
    On vois bien qu'il marche deux fois et qu'ensuite il plante deux fois...

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Citation Envoyé par charleslaidi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function1 ()
    {
    echo EXTRACTION DU ${var1}
    
    for filename in `cat list.txt` ; 
    do fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var2} -thr ${var2} ${filename}_conv/rois/${filename}_${var1}  
    done
    ...
    ...
    }
    while read var1 var2; do
        while read filename; do
            function1
        done < list.txt
    done < variables.txt
    Tu ne pense pas que ce qui pose problème, c'est la double boucle (en rouge):
    la fonction fait la boucle sur ta liste de fichier, et la boucle while read filename aussi... ???

  16. #16
    Membre habitué
    Homme Profil pro
    autres
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autres
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut oui
    Citation Envoyé par disedorgue Voir le message
    Tu ne pense pas que ce qui pose problème, c'est la double boucle (en rouge):
    la fonction fait la boucle sur ta liste de fichier, et la boucle while read filename aussi... ???
    Mais oui je pensais aussi, du coup j'ai essayé d'enlever les boucles for, en laissant simplement les commandes :

    fsl4.1-fslmaths ${filename}_conv/mri/aseg_raw.nii.gz -uthr ${var2} -thr ${var2} ${filename}_conv/rois/${filename}_${var1}

    (sans le for filename, le do et le done)

    mais ça n'a pas marché,

    Ensuite j'ai essayé aussi d'enlever le < list.txt dans la citation suivante :

    while read var1 var2; do
    while read filename; do
    function1
    done < list.txt
    done < variables.txt
    Mais ça n'a pas marché non plus.

    Je ne comprends pas pourquoi il y a des répétitions non voulues...

    Merci beaucoup pour votre aide à tous.

    Bonne soirée,

    Charles

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour,

    comme l'a suggéré disedorgue, les boucles for relisent toutes le même fichier que la boucle while;
    alors que la fonction devrait prendre en argument le fichier lu dans le fichier, et l'utiliser dans les commandes.
    les boucles for sont inutiles.
    la fonction aussi d'ailleurs.

    revois ton algorithme (utilise un arbre de décision), c'est confus.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par charleslaidi Voir le message
    Mais oui je pensais aussi, du coup j'ai essayé d'enlever les boucles for...mais ça n'a pas marché,
    Ensuite j'ai essayé aussi d'enlever le < list.txt...mais ça n'a pas marché non plus.
    En prog (shell ou autre), on n'essaye pas des trucs au petit bonheur. On réfléchit à la façon dont les données sont organisées et la façon de les utiliser pour obtenir le résultat attendu.
    T'as vérifié que dans cette boucle
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read var1 var2; do
     ...
    done < variables.txt
    var1 et var2 avaient la bonne valeur ???
    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]

  19. #19
    Membre habitué
    Homme Profil pro
    autres
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autres
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En prog (shell ou autre), on n'essaye pas des trucs au petit bonheur. On réfléchit à la façon dont les données sont organisées et la façon de les utiliser pour obtenir le résultat attendu.
    T'as vérifié que dans cette boucle
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read var1 var2; do
     ...
    done < variables.txt
    var1 et var2 avaient la bonne valeur ???
    Bonjour,

    Je suis d'accord avec toi je vais essayer de plus structurer.

    Les valeurs de var 1 et var 2 sont les bonnes ; j'ai vérifié, et en fait le script marche mais j'ai des messages d'erreur et la boucle tourne en rond. Mais le résultat pour moi est le bon.

    Merci pour ton aide,

  20. #20
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Bonjour

    Est-ce qu'on peut espérer avoir un résumé des entrées, des sorties attendues, du fonctionnement des commandes externes, afin de proposer une solution saine plutôt que de patauger dans ce script mal-écrit qui ne tient même pas compte de nos remarques (le "cat fichier" pour alimenter un for n'est pas bon si tes lignes ont des espaces; le "read var1 var2" met dans var2 tout le reste de la ligne, donc s'il y a un commentaire ou var3, ton script ne marchera pas) ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Boucle for sur une variable sans prendre en compte les espaces
    Par laurentze dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/03/2012, 11h15
  2. Boucle for et plusieurs if enchainés --> comment optimiser le code?
    Par bilou_12 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/02/2012, 17h39
  3. [XSLT] PB: Boucle (for-each) et variable
    Par luchoo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/11/2010, 13h58
  4. Réponses: 2
    Dernier message: 14/04/2010, 18h39
  5. Boucle for avec 2 variables
    Par radzar dans le forum PL/SQL
    Réponses: 8
    Dernier message: 15/05/2009, 12h07

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