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 :

Retrouver le nom d'une variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut Retrouver le nom d'une variable
    Dsl par avance par ma noobitude, après différentes recherches, je tente une dernière carte.
    Ma question est :

    Existe t il une méthode ou une commande avec un obscur paramètre pour retrouver le nom d'une variable ?
    J'ai trouvé qqchose d'approchant avec la commande "declare -n", mais je n'ai pas saisi comment l'utiliser.
    Je me doute que cela n'est peux être pas possible ... mais c'est un questionnement sur un futur script, dont l'intérêt est qu'il soit capable de créer lui même un seconde script (d'ou le soucis de nom de variables). Une sorte de méta-script créant ses propres scripts. Bref un peu tordu, je l'avoue.

    Merci d'avance pour votre partage de savoir, et dsl pour l'énormité demandé.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 748
    Par défaut
    Citation Envoyé par totom7 Voir le message
    Existe t il une méthode ou une commande avec un obscur paramètre pour retrouver le nom d'une variable ?
    Quelle est l'entrée de ton [méta-]script ? Où se trouve la variable ?


    Citation Envoyé par totom7 Voir le message
    declare -n
    D'après les Internets declare permet de créer 1 variable : declare [-aAfFgilnrtux] [-p] [name[=value]].

    Mais l'avantage de declare parce que declare asdf="some text" équivaut à $asdf="some text", et de proposer 1 type : -i entier, -a tableau, -A tableau associatif, …

    La bascule -n permet de faire 1 "alias" (n pour nameref) : la valeur est le nom d'1 autre variable et ainsi lorsqu'on modifie l'"alias", on modifie la vraie variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare -n  first="$1"
    $first=10

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Je te remercie pour les éclaircissements pour la commande declare, et je me rends compte que je me suis complètement fourvoyé.

    En fait j'imaginais un script permettant de créer un second script à partir de l'éxécution du premier (avec l'aide de nombreux echo).
    Donc le premier qui ferait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Script_sh="./Script_second.sh"
    URL_Site=http://www.disney.fr
     
    echo "URL_Site=$URL_Site" >> $Script_SH
    echo "/usr/bin/chromium-browser $URL_Site" >> $Script_SH
    mais le code retranscris ceci dans le second script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    URL_Site=http://www.disney.fr
    /usr/bin/chromium-browser http://www.disney.fr
    Le second script est fonctionnel mais je n'ai aucun intérêt a intégrer le premier echo puisque que mon code utilisera la valeur de la variable $URL_Site au lieu de retranscrire son nom avec l'echo.

    Merci encore pour votre aide, je sais que c'est un point de détail mais un peu de culture n'as jamais fait de mal.

  4. #4
    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
    plus bête que la question* est le sujet "question bête" !

    --
    * NB: « il n'est point de sots métiers sottes questions, il n'est que de sottes gens »
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    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
    Bonjour
    Citation Envoyé par totom7 Voir le message
    En fait j'imaginais un script permettant de créer un second script à partir de l'éxécution du premier (avec l'aide de nombreux echo).
    Idée plutôt bizarre. J'ai longtemps codé en shell, je n'ai jamais eu besoin de faire cela. De plus, tout ce que ferait ton second script serait déjà faisable par le premier. Ne s'agirait-il pas d'un problème XY???

    Accessoirement, pour écrire plusieurs lignes d'un coup (ça c'est des trucs faisables), tu as plus simple que toutes ces redirections multiples
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Script_sh="Script_second.sh"
    URL_Site=http://www.disney.fr
     
    (
    	echo "URL_Site=$URL_Site"
    	echo "/usr/bin/chromium-browser $URL_Site"
    ) > "$Script_SH"
     
    cat <<_EOT_ >"$Script_SH"
    URL_Site=$URL_Site
    /usr/bin/chromium-browser $URL_Site
    _EOT_
    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]

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Script_sh='Script_second.sh'
    URL_Site='http://www.disney.fr'
     
    {
    	echo "URL_Site=$URL_Site"
    	echo "/usr/bin/chromium-browser $URL_Site"
    } > "$Script_sh"
    ça fonctionne aussi bien avec des accolades, sans créer de sous-shell.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 287
    Par défaut
    bonjour

    si je comprend bien, tu désires que seul le second echo soit le nom de la variable et non sont contenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "URL_Site=$URL_Site"
    echo "/usr/bin/chromium-browser \$URL_Site"

  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 N_BaH Voir le message
    ça fonctionne aussi bien avec des accolades, sans créer de sous-shell.
    Oui désolé, j'y pense jamais. En fait j'ai appris (et pris l'habitude) avec les parenthèses sans savoir que ça créait un sous-shell.
    Mais avec le recul (les accolades pour les fonctions, les parenthèses quand je fais (cd source; tar cf - truc) | (cd dest; tar xpvf -)), c'est logique...
    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 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

    Pardon ? Qu'est-ce qui est logique dans le fait de créer un sous-shell dans un sous-shell ? La conduite crée un sous-shell et les parenthèses aussi.

  10. #10
    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 Flodelarab Voir le message
    Pardon ? Qu'est-ce qui est logique dans le fait de créer un sous-shell dans un sous-shell ?
    J'ai écrit que j'utilisais les parenthèses sans penser que ça créait un sous-shell. Ensuite j'ai rajouté qu'avec mes commandes habituelles, en donnant comme exemple le tar pipe tar qui permet de copier source/truc dans dest à l'identique (préservant les liens, les liens syboliques, les fichiers pipes), aurait dû me faire penser que les parenthèses créent un sous-shell. C'est ça qui est logique.
    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]

  11. #11
    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 foetus Voir le message
    Quelle est l'entrée de ton [méta-]script ? Où se trouve la variable ?



    D'après les Internets declare permet de créer 1 variable : declare [-aAfFgilnrtux] [-p] [name[=value]].

    Mais l'avantage de declare parce que declare asdf="some text" équivaut à $asdf="some text", et de proposer 1 type : -i entier, -a tableau, -A tableau associatif, …

    La bascule -n permet de faire 1 "alias" (n pour nameref) : la valeur est le nom d'1 autre variable et ainsi lorsqu'on modifie l'"alias", on modifie la vraie variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare -n  first="$1"
    $first=10
    Visiblement, celui qui t'a "moinsé" n'a pas tout compris, voici donc en vrac des tests qui peuvent être incompréhensibles (la réponse est dans ce que tu dis) :
    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
    $ declare -p ZZZZ
    -bash: declare: ZZZZ: not found
    $ declare -n ZZZZ=TOTO
    $ declare -p ZZZZ
    declare -n ZZZZ="TOTO"
    $ unset ZZZZ
    $ declare -p ZZZZ
    declare -n ZZZZ="TOTO"
    $ echo $ZZZZ
     
    $ ZZZZ=TOTO
    $ echo $ZZZZ
    TOTO
    $ declare -p ZZZZ
    declare -n ZZZZ="TOTO"
    $ unset ZZZZ
    $ declare -p ZZZZ
    declare -n ZZZZ="TOTO"

  12. #12
    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
    C'est moi qui ai moinssé. En shell, il y a une différence marquée entre la L-value et la R-value d'une variable. Et de voir écrit, par deux fois (donc ce n'est pas une faute de frappe), une L-value de variable commencée par un dollar, cela m'a fatigué.

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

Discussions similaires

  1. Module dont le nom est une variable
    Par Mr Hyde dans le forum Général Python
    Réponses: 11
    Dernier message: 26/02/2023, 20h39
  2. [Tableaux] Concaténation du nom d'une variable
    Par nebule dans le forum Langage
    Réponses: 11
    Dernier message: 18/05/2006, 11h30
  3. Réponses: 37
    Dernier message: 02/03/2006, 01h58
  4. Incrémenter le NOM d'une variable
    Par Mors_Ubyte dans le forum Access
    Réponses: 1
    Dernier message: 03/01/2006, 18h47
  5. [Reflection] Connaître le nom d'une variable ...
    Par dahwoud dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 09/08/2005, 14h37

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