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 :

[bash] Variable indirection


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut [bash] Variable indirection
    Bonjour,

    J'ai quelques questions sur les "variable indirection" (variables indirectes en français ??).
    Ma version de bash :
    GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)

    J'ai un script qui sert à désarchiver plusieurs fichiers qui se trouvent dans différentes archives (et à faire d'autres choses aussi).
    Les fichiers à désarchiver sont à passer en argument du script.

    Dans fichiers_ABCD.tar.gz, il y aura des fichiers se nommant par exemple :
    fichier_ABCD_000001.xml
    fichier_ABCD_000002.xml
    etc...

    Dans fichiers_1234.tar.gz, il y aura des fichiers se nommant par exemple :
    fichier_1234_000001.xml
    fichier_1234_000002.xml
    etc...


    Voici le script (enfin une partie) :
    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
    38
    39
    40
    41
    #!/bin/bash
     
    CR=0
    for fic
    do
        # Test important suite à l'utilisation d'eval plus bas
        ( LC_COLLATE=C; [[ $fic != fichier_[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]_[0-9][0-9][0-9][0-9][0-9][0-9].xml ]] ) && {
            echo "ERREUR - Nom de fichier incorrect ($fic)"
            CR=1
        }
        (( CR )) && continue
     
        code=${fic:8:4}
        [[ ${liste_codes[@]} != *$code* ]] && liste_codes+=("$code") # Tableau contenant la liste des codes
     
        # Ajout d'un élément dans le tableau fics_ABCD si par exemple $code == ABCD
        # Il est important d'avoir bien verifié la valeur de $code
        eval fics_$code'+=("$fic")'
    done
    (( CR )) && exit 1
     
    rep_extract_fics=/destination/des/fichiers
     
    for code in "${liste_codes[@]}"
    do
        echo; echo "Désarchivage des fichiers pour $code..."
     
        nom_liste=fics_$code[@] # Ex : si $code == ABCD, alors $nom_liste vaudra fics_ABCD[@]
     
        archive=/emplacement/des/archives/${code}/fichiers_${code}.tar.gz # Emplacement de l'archive
     
        echo ">>> Extraction des fichiers depuis $archive..."
        tar xvf "$archive" -C "$rep_extract_fics" "${!nom_liste}" # "${!nom_liste}" équivaut à "${fics_ABCD[@]}" si $code == ABCD
        (($?)) && { echo "ERREUR - Echec de l'extraction des fichier_${code}_*.xml"; exit 1;}
        echo "Extraction OK"
     
        echo ">>> Mise à jour des droits des fichiers désarchivés pour $code..."
        eval 'chmod 660 "${'"$nom_liste"'/#/$rep_extract_fics/}"' # Utilisation de eval car "${!nom_liste/#/$rep_extract_fics/}" rajoute $rep_extract_fics/ seulement devant le premier element du tableau
        (($?)) && { echo "ERREUR - Echec de la mise à jour des droits des fichiers désarchivés"; exit 1;}
        echo "Mise à jour des droits OK"
    done
    eval fics_$code'+=("$fic")' : peut-on remplir le tableau, dont le nom n'est donc pas défini directement, sans utiliser eval ?

    tar xvf "$archive" -C "$rep_extract_fics" "${!nom_liste}" : fonctionne comme je m'y attendais ; si $nom_liste == fics_ABCD[@], "${!nom_liste}" me donne bien tous les éléments, comme si j'avais utilisé directement "${fics_ABCD[@]}"

    Par contre, ça "bug" pour ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ fics_ABCD=(aa bb cc dd)
    $ nom_liste=fics_ABCD[@]
    $ echo "${!liste#?}"
    a bb cc dd
    Je m'attendais plutôt au résultat a b c d, comme si j'avais tapé echo "${fics_ABCD[@]#?}"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "${!liste/#/X}"
    Xaa bb cc dd
    Je m'attendais plutôt au résultat Xaa Xbb Xcc Xdd, comme si j'avais tapé echo "${fics_ABCD[@]/#/X}"

    C'est un bug ou c'est logique ce fonctionnement ?

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ fics_ABCD=(aa bb cc dd)
    $ nom_liste=fics_ABCD[@]
    $ echo "${!liste#?}"
    a bb cc dd
    Quel est le lien entre la première ligne et la deuxième ? Aucun rapport.
    Quel est le lien entre la seconde ligne et la troisième ? Aucun rapport.

    Je m'attendais plutôt au résultat a b c d, comme si j'avais tapé echo "${fics_ABCD[@]#?}"
    C'est ce qu'on obtient dans la séquence suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ fics_ABCD=(aa bb cc dd)
    $ echo ${fics_ABCD[@]#?}
    a b c d
    Je m'attendais plutôt au résultat Xaa Xbb Xcc Xdd, comme si j'avais tapé echo "${fics_ABCD[@]/#/X}"
    T'as bien compris que tu as concaténé les valeurs du tableau en une seule variable "liste".
    Il n'affiche pas 4 valeurs précédées d'un X mais une seule précédée d'un X.
    C'était pareil pour ta suppression.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    utilise un tableau associatif
    d'autant que tu sembles n'utiliser que le tableau en entier (tu n'itères pas sur ses éléments, sinon, tu peux toujours insérer un séparateur entre les valeurs).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par Flodelarab
    Quel est le lien entre la première ligne et la deuxième ? Aucun rapport.
    Quel est le lien entre la seconde ligne et la troisième ? Aucun rapport.
    Mais si, il y a un rapport :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ fics_ABCD=(aa bb cc dd)
     
    $ nom_liste=fics_ABCD[@]
     
    $ echo "${!nom_liste}"
    aa bb cc dd # Affiche la même chose que : echo "${fics_ABCD[@]}"
     
    $ echo "${fics_ABCD[@]}"
    aa bb cc dd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo "${!nom_liste/#/Prefix }"
    Prefix aa bb cc dd # N'affiche pas la même chose que : echo "${fics_ABCD[@]/#/Prefix }"
     
    $ echo "${fics_ABCD[@]/#/Prefix }"
    Prefix aa Prefix bb Prefix cc Prefix dd
    En fait, quand $var == blop[@], je m'interroge sur le fait que "${!var}" correspond bien à "${blop[@]}" MAIS par contre, "${!var/#/prefix}" ne correspond pas à "${blop[@]/#/prefix}" ??
    C'est un bug, non ? Ou il y a une logique mais que je n'ai pas compris... Pour moi, "${!var/#/prefix}" devrait correspondre à "${blop[@]/#/prefix}"... Mais non !

  5. #5
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    utilise un tableau associatif
    d'autant que tu sembles n'utiliser que le tableau en entier (tu n'itères pas sur ses éléments, sinon, tu peux toujours insérer un séparateur entre les valeurs).
    J'avais pensé au tableau associatif mais j'avoue que je ne vois pas comment l'utiliser dans mon cas... Des fois, on est parti sur une idée et on voit rien d'autre... Ou si, quand on revient dessus 6 mois après, on se dit "mais bon sang, suis trop con !!"
    Bref, je veux bien ta proposition avec tableau associatif ! (enfin, une idée quoi, pas un truc tout fait !)

    Mais sinon, j'aimerais quand même bien comprendre, dans le cas où $var == tab[@],
    pourquoi "{$!var}" == "${tab[@]}"
    Mais "{$!var/#/X}" != "${tab[@]/#/X}" ??? (c'est pareil avec toutes les formes de développement des variables : "{$!var%.*}" != "${tab[@]%.*}" )

  6. #6
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par Flodelarab
    T'as bien compris que tu as concaténé les valeurs du tableau en une seule variable "liste".
    Non ! Si ?!?!
    Pour moi, quand je fais nom_liste=fics_ABCD[@], je n'affecte pas les valeurs du tableau fics_ABCD à la variable nom_liste, je ne fais qu'affecter la chaîne de caractère "fics_ABCD[@]" à la variable nom_liste... Non ??

    Edit : d'ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ fics_ABCD=(aa bb cc dd)
    $ nom_liste=fics_ABCD[@]
    $ echo "$nom_liste"
    fics_ABCD[@]
    $ echo "${!nom_liste}"
    aa bb cc dd

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    J'avais pensé au tableau associatif mais j'avoue que je ne vois pas comment l'utiliser dans mon cas... Des fois, on est parti sur une idée et on voit rien d'autre... Ou si, quand on revient dessus 6 mois après, on se dit "mais bon sang, suis trop con !!"
    Parce que, dans ce projet, il manque une phase essentielle: la conception

    Pour moi, quand je fais nom_liste=fics_ABCD[@], je n'affecte pas les valeurs du tableau fics_ABCD à la variable nom_liste, je ne fais qu'affecter la chaîne de caractère "fics_ABCD[@]" à la variable nom_liste... Non ??
    Oui. Donc nous sommes d'accord que la première ligne et la seconde n'ont pas de rapport.
    Quand à la troisième ligne, "liste" n'est jamais définie. Donc pas de rapport avec le reste.



    De toute façon, tu veux emboîter des fonctionnalités qui ne s'emboîtent pas.
    Soit ${var/toto/tata}, soit ${!var[@]} mais pas ${!var[@]/toto/tata}.

    Aucun habitué ne ferait comme toi.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par Flodelarab
    Oui. Donc nous sommes d'accord que la première ligne et la seconde n'ont pas de rapport.
    Quand à la troisième ligne, "liste" n'est jamais définie. Donc pas de rapport avec le reste.
    Si, la première ligne est en rapport avec la 2ème. La variable créée dans la 2ème sert pour "l'indirection"

    Par contre OK, pour la 3ème, c'est une erreur de copier/collé, désolé !
    Ce que je voulais indiquer, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ fics_ABCD=(aa bb cc dd)
    $ nom_liste=fics_ABCD[@]
    $ echo "${!nom_liste#?}"
    a bb cc dd
    Quand on fait ceci, on a bien "${fics_ABCD[@]}" égal à "${!nom_liste}" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ fics_ABCD=(aa bb cc dd)
    $ nom_liste=fics_ABCD[@]
    $ echo "${!nom_liste}"
    aa bb cc dd
    $ echo "${fics_ABCD[@]}"
    aa bb cc dd
    $ [[ ${!nom_liste} = ${fics_ABCD[@]} ]] && echo OK
    OK
    Donc, je vois pas en quoi c'est totalement tordu de penser que ${!nom_liste#?} serait égal à ${fics_ABCD[@]#?} (ou tout autre forme de ce genre) ; mais non...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ fics_ABCD=(aa bb cc dd)
    $ nom_liste=fics_ABCD[@]
    $ echo "${!nom_liste%?}"
    aa bb cc d # seul le dernier élément est impacté
    $ echo "${fics_ABCD[@]%?}"
    a b c d # tous les éléments sont impactés
    $ [[ ${!nom_liste%?} = ${fics_ABCD[@]%?} ]] && echo OK
    $
    Citation Envoyé par Flodelarab
    Parce que, dans ce projet, il manque une phase essentielle: la conception
    Euh... Peut-être... Ce qui n'empêche pas des projets avec des heures et des heures de conceptions d'avoir été pensé n'importe comment...
    Et me dis pas qu'il ne t'est jamais arrivé de repasser sur un script et de te dire "ah, j'aurais plutôt du faire ça comme ça" ? Ne serait ce que par rapport à ce que tu as pu apprendre entre temps.
    Enfin, peut-être que ça ne t'arrive pas... Moi si ! Mais je suis preneur de toute idée et conseil !

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,

    La bonne méthode d'indirection en bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ echo ${fics_ABCD[@]} 
    aa zz cc dd
    $ code=ABCD
    $ typeset -n nom_list="fics_$code"
    $ echo ${nom_list[@]}
    aa zz cc dd
    $ fics_ABCD[1]=xx
    $ echo ${nom_list[@]}
    aa xx cc dd
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ declare -A aArr
    $ var=indice
    $ test -v aArr["$var"] && aArr["$var"]+="|val_$((++n))" || aArr["$var"]="valeur_initiale"
    $ test -v aArr["$var"] && aArr["$var"]+="|val_$((++n))" || aArr["$var"]="valeur_initiale"
    $ test -v aArr["$var"] && aArr["$var"]+="|val_$((++n))" || aArr["$var"]="valeur_initiale"
    $ test -v aArr["$var"] && aArr["$var"]+="|val_$((++n))" || aArr["$var"]="valeur_initiale"
    $ echo "${aArr['indice']}"
    valeur_initiale|val_1|val_2|val_3
    arr=( $(IFS='|'; printf '%s\n' ${aArr["$var"]}) )
    $ printf '%s\n' "${arr[@]/#/X}"                                                                                                                                                                                                     
    Xvaleur_initiale                                                                                                                                                                                                                                                         
    Xval_1
    Xval_2
    Xval_3
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    La bonne méthode d'indirection en bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ echo ${fics_ABCD[@]} 
    aa zz cc dd
    $ code=ABCD
    $ typeset -n nom_list="fics_$code"
    $ echo ${nom_list[@]}
    aa zz cc dd
    $ fics_ABCD[1]=xx
    $ echo ${nom_list[@]}
    aa xx cc dd
    Merci pour ta réponse.
    J'avais vu cette option de typeset dans la doc... Mais pas présente dans ma version de bash hélas (4.1.2).

    Mais j'ai une petite question, en reprenant ton exemple, est ce que si on fait nom_list[1]=toto, on se retrouve avec la valeur toto dans fics_ABCD[1] également ? (j'aurais bien testé mais je ne peux pas !)

    Et dans un man trouvé sur le net, je vois ceci :
    -n Give each name the nameref attribute, making it a name reference to another variable. That other variable is defined
    by the value of name. All references, assignments, and attribute modifications to name, except those using or chang‐
    ing the -n attribute itself, are performed on the variable referenced by name's value. The nameref attribute cannot
    be applied to array variables.


    @N_BaH : merci pour ton exemple.

    Edit :
    J'ai trouvé un serveur avec une version plus récente de bash pour tester, et donc nom_list[1]=toto met bien à jour fics_ABCD[1]

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Sinon, les raisons de pourquoi cela ne fonctionne pas en passant par ${!nom_list}:
    - pour un tableau en bash, la récupération des index se fait via: ${!tab[@]} ou ${!tab[*]}.
    - l'ordre pratiqué par bash lors de l'expansion est (depuis le man) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    EXPANSION
           Expansion  is  performed  on  the command line after it has been split into words.  There are seven kinds of expansion performed: brace expansion,
           tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion.
    
           The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command  substitution  (done  in  a
           left-to-right fashion), word splitting, and pathname expansion.
    Personnellement, je ne conseil pas du tout d'utiliser l'indirection en bash car celle-ci est loin d'avoir une spec claire et peut encore changer dans le futur.

    sinon, si tu ne veux pas trop modifier ton code, tu peux passer par une étape de copie, ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo ${fics_ABCD[@]}
    aa toto cc dd
    $ code=ABCD
    $ nom_liste=fics_$code[@]
    $ nom_liste=(${!nom_liste})
    $ echo ${nom_liste[@]}
    aa toto cc dd
    Cordialement.

  13. #13
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    @disedorgue :

    Merci pour tes explications... Même si j'avoue que je ne comprends toujours pas pourquoi ${!nom_liste} est bien égal à ${fics_ABCD[@]} mais que ${!nom_liste%?} est différent de ${fics_ABCD[@]%?} !!
    Enfin, je me prends la tête pour pas grand chose.

    L'idée de la copie... Géniale !! MERCI !

  14. #14
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Je t'ai répondu. Tu emboîtes des fonctionnalités qui ne s'emboîtent pas.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Citation Envoyé par Postmortem Voir le message
    L'idée de la copie... Géniale !! MERCI !
    En fait, pas si géniale que ça, si dans ton tableau de départ, les valeurs ont des espaces, alors la copie sera fausse: tu auras une copie de tableau plus grande que le tableau initial.
    Cordialement.

  16. #16
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    En fait, pas si géniale que ça, si dans ton tableau de départ, les valeurs ont des espaces, alors la copie sera fausse: tu auras une copie de tableau plus grande que le tableau initial.
    Si si, ça fonctionne si on met les guillemets où il faut :
    Tableau avec plus de valeurs :
    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
    ~$ fics_ABCD=('a a' 'b b' 'c c' 'd d')
    ~$ code=ABCD
    ~$ nom_liste=fics_$code[@]
    ~$ nom_liste=(${!nom_liste})
    ~$ for i in "${nom_liste[@]}"
    > do
    > echo "@$i@"
    > done
    @a@
    @a@
    @b@
    @b@
    @c@
    @c@
    @d@
    @d@
    Tableau OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ~$ fics_ABCD=('a a' 'b b' 'c c' 'd d')
    ~$ code=ABCD
    ~$ nom_liste=fics_$code[@]
    ~$ nom_liste=("${!nom_liste}")
    ~$ for i in "${nom_liste[@]}"
    > do
    > echo "@$i@"
    > done
    @a a@
    @b b@
    @c c@
    @d d@
    ~$

    Citation Envoyé par Flodelarab Voir le message
    Je t'ai répondu. Tu emboîtes des fonctionnalités qui ne s'emboîtent pas.
    Ça ne s’emboîte peut-être pas mais j'ai un résultat, sans message d'erreur.
    Je souhaiterais comprendre le résultat. J'aurais eu un message d'erreur, j'aurais laissé tombé ; mais là, j'ai un résultat qui pour moi, n'est pas logique. J'aimerais comprendre le pourquoi de ce résultat qui est peut-être (certainement ?) logique...

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Exacte, ça m'apprendra à ne pas suivre la règle d'or:
    Il faut protéger ces variables avec des guillemets sauf si on sait pourquoi on ne le fait pas !!!

    Sinon, juste pour faire un echo de chaque valeur du tableau, on peut le faire avec printf qui gère la boucle lui même:
    avant copie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "@%b@\n" "${!nom_liste}"
    après copie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "@%b@\n" "${nom_liste[@]}"
    Cordialement.

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

Discussions similaires

  1. Enumération en cascade et Variable Indirect
    Par Neutthsch dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 24/02/2016, 15h11
  2. Bash : variable représentant un dossier et pourtant vide
    Par ticNFA dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 27/11/2012, 14h18
  3. [bash] variables dans fonction lancée en background
    Par gogy13 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 05/06/2011, 09h14
  4. Réponses: 2
    Dernier message: 15/05/2008, 16h47
  5. [script bash] variables non affichées
    Par persam dans le forum Administration système
    Réponses: 4
    Dernier message: 08/01/2008, 18h21

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