Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 22-08-2017 04:46:11

jpmacveigh
Membre
Lieu : Lille
Noyau : Linux 4.9.17-c9
Inscription : 22-08-2017

[Résolu] Nom de variable contenu dans une variable

Bonjour,
Comment créer une variable dont le nom est contenu dans une autre variable ?
Merci.

Dernière modification par jpmacveigh (24-08-2017 04:29:38)

Hors ligne

#2 22-08-2017 05:02:44

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 3.16.0-4-amd64 - 3.16.39-1
(G)UI : gnome 1:3.14+3
Inscription : 21-10-2008

Re : [Résolu] Nom de variable contenu dans une variable

Exemple ?

"Théo et Adama te rappellent pourquoi Zyed et Bouna couraient…"
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

En ligne

#3 22-08-2017 05:08:30

jpmacveigh
Membre
Lieu : Lille
Noyau : Linux 4.9.17-c9
Inscription : 22-08-2017

Re : [Résolu] Nom de variable contenu dans une variable

nomVar="x"  # je met dans la variable nomVar le nom que je souhaite donner à ma variable
$nomVar=2  #  je souhaite donner à la variable de nom x la valeur 2

j'obtiens x: command not found

jpmv:~/workspace $ nomVar="x"
jpmv:~/workspace $ $nomVar = 2
bash: x: command not found
jpmv:~/workspace $

Hors ligne

#4 22-08-2017 06:42:11

MicP
Membre
Distrib. : debian stable
Noyau : Linux 3.16.0-4-amd64
(G)UI : Xfce
Inscription : 29-02-2016

Re : [Résolu] Nom de variable contenu dans une variable

Bonjour

michel@debg53sw:~$ nomVar=x              # j'assigne le caractère "x" à la variable nommée "nomVar"
michel@debg53sw:~$ eval $nomVar=2        # j'assigne le caractère "2" à la variable dont le nom est contenu dans la variable "nomVar"
michel@debg53sw:~$
michel@debg53sw:~$ echo $nomVar          # j'affiche la valeur qui avait été assignée à la variable nommée "nomVar"
x
michel@debg53sw:~$ eval echo \$$nomVar   # j'affiche la valeur qui avait été assignée à la variable dont le nom est contenu dans la variable "nomVar"
2
michel@debg53sw:~$

Dernière modification par MicP (22-08-2017 13:08:04)

Hors ligne

#5 22-08-2017 22:44:07

jpmacveigh
Membre
Lieu : Lille
Noyau : Linux 4.9.17-c9
Inscription : 22-08-2017

Re : [Résolu] Nom de variable contenu dans une variable

Réponse très claire.
J'étais, jusqu'à ce jour, complètement passé à coté de la commande eval.
Merci beaucoup.
kernal_panic.gif

Hors ligne

#6 23-08-2017 04:41:15

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 3.16.0-4-amd64 - 3.16.39-1
(G)UI : gnome 1:3.14+3
Inscription : 21-10-2008

Re : [Résolu] Nom de variable contenu dans une variable

jpmacveigh a écrit :

Merci beaucoup.


Donc, plus qu'à mettre résolu sur le post :
Voir le tuto : C'est résolu ! Bravo mais il faut l'indiquer dans l'titre.

Petit petit petit.. point chocolat df... vient dans la besace à Jojo...
... 40-229f.gif


"Théo et Adama te rappellent pourquoi Zyed et Bouna couraient…"
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

En ligne

#7 23-08-2017 17:34:02

jpmacveigh
Membre
Lieu : Lille
Noyau : Linux 4.9.17-c9
Inscription : 22-08-2017

Re : [Résolu] Nom de variable contenu dans une variable

En fait ce n'est pas tout à fait résolu car avec :

nomVar=x              # j'assigne le caractère "x" à la variable nommée "nomVar"
eval $nomVar=2        # j'assigne le caractère "2" à la variable dont le nom est contenu dans la variable "nomVar"
echo $nomVar          # j'affiche la valeur qui avait été assignée à la variable nommée "nomVar"
eval echo \$$nomVar   # j'affiche la valeur qui avait été assignée à la variable dont le nom est contenu dans la variable "nomVar"

je ne vois pas que la variable est adressée par son nom "x". Toutes les commandes font toujours référence à nomVar pour afficher la valeur de x

Hors ligne

#8 23-08-2017 18:19:46

MicP
Membre
Distrib. : debian stable
Noyau : Linux 3.16.0-4-amd64
(G)UI : Xfce
Inscription : 29-02-2016

Re : [Résolu] Nom de variable contenu dans une variable

michel@debg53sw:~$ nomVar=x              # j'assigne le caractère "x" à la variable nommée "nomVar"
michel@debg53sw:~$ eval $nomVar=2        # j'assigne le caractère "2" à la variable dont le nom est contenu dans la variable "nomVar"
michel@debg53sw:~$
michel@debg53sw:~$ echo $nomVar          # j'affiche la valeur qui avait été assignée à la variable nommée "nomVar"
x
michel@debg53sw:~$ eval echo \$$nomVar   # j'affiche la valeur qui avait été assignée à la variable dont le nom est contenu dans la variable "nomVar"
2
michel@debg53sw:~$ echo $x               # j'affiche la valeur qui avait été assignée à la variable nommée "x"            
2
michel@debg53sw:~$
 

Dernière modification par MicP (23-08-2017 18:20:29)

Hors ligne

#9 23-08-2017 19:35:43

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.11.12
(G)UI : openbox
Inscription : 26-08-2010

Re : [Résolu] Nom de variable contenu dans une variable

Tu ne nous a pas dit pourquoi tu avais besoin d'un indirection de
variable. Je demande car il exsite peut être une meilleure méthode que
l'utilisation de eval.

En principe, on évite d'utiliser eval. On préfère passer par d'autres
mécanismes. 

C'est possible de faire une indirection sans passer par eval. Il
suffit d'utiliser declare (qui permet de déclarer des variables avec
pleins d'options) :


maVar=x             # maVar vaut x            
declare $maVar=2    # x vaut 2
echo $x             # affiche 2
echo ${!maVar}      # pareil que précédemment
 


Le ! permet de faire une indirection au lieu récupérer le
contenu de maVar on récupère celui de la variable de nom $maVar
(qui vaut ici x) et donc le contenu de x.


Il existe aussi un moyen de créer une référence sur un autre variable.
C'est un peu comme si on donnait un nouveau nom pour accéder à une
variable. declare -n maVar=x va permettre de créer un nouvel
alias pour la variable « x ». Cela ne fonctionne pas avec la version
de bash de Jessie, mais pour stretch cela devrait fonctionner.

Ce qui ne marche pas c'est local qui n'existait pas dans bash
version 4.3 mais qui peut être remplacé par declare
.


Du coup on peut y accéder sous les deux noms maVar et
x.
C'est utile pour passer plusieurs tableaux à une fonction.

Exemple basique :


declare -n maVar=x  # maVar est une référence sur la variable x
maVar=coucou         # On affecte maVar1 et donc x aussi
echo $x                   # affiche coucou
 



Un exemple avec un fonction qui prend deux tableaux en paramètres :


#! /bin/bash

ma_fonction(){
# permet d'échanger le second élément du premier tableau
# avec le premier du second tableau
# Pour jessie remplacer les « local » par des « declare »
    local -n premier=$1
    local -n second=$2
    local temp
   
    temp=${premier[1]}
    premier[1]=${second[0]}
    second[0]=$temp
}

affiche(){
# affiche les éléments d'un tableau
# Pour jessie remplacer les « local » par des « declare »
    local -n tab=$1
    echo "Les éléments de $1 sont :"
    for element in ${tab[@]}; do
        echo $element
    done
}

# ici les deux declare sont facultatifs. declare -a déclare
# une variable de type tableau.
declare -a tab1=(1 2 3)
declare -a tab2=(4 5 6)

ma_fonction tab1 tab2
affiche tab1
affiche tab2
 




EDIT: Remarque importante. Ces deux méthode ne fonctionnent pas avec dash !
Avec ce dernier on est obligé d'utiliser eval.

Dernière modification par enicar (23-08-2017 20:19:37)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#10 24-08-2017 03:56:32

jpmacveigh
Membre
Lieu : Lille
Noyau : Linux 4.9.17-c9
Inscription : 22-08-2017

Re : [Résolu] Nom de variable contenu dans une variable

Merci pour toute votre aide.

Hors ligne

#11 24-08-2017 08:19:53

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 3.16.0-4-amd64 - 3.16.39-1
(G)UI : gnome 1:3.14+3
Inscription : 21-10-2008

Re : [Résolu] Nom de variable contenu dans une variable

/me conserve son point choco df, et pi cé tou...
... 31-2629.gif

"Théo et Adama te rappellent pourquoi Zyed et Bouna couraient…"
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

En ligne

Pied de page des forums