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 :

export de variables dynamiques


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Par défaut export de variables dynamiques
    Bonjour,
    Je voudrai écrire un script qui lit un fichier texte (sous le forme CLE=VALEUR) et transformer le contenu en des variables d'environnement.

    Fichier:
    -------
    CLE1=VAL1
    CLE2=VAL2


    script:
    ------
    while read ligne
    do

    echo CLE :`echo $ligne | awk -F= '{print $1}' `
    echo VAL :`echo $ligne | awk -F= '{print $2}' `

    #export $CLE=$VAL
    #export ${CLE}=${VAL}
    #export '${CLE}'='${VAL}'
    #export `echo $CLE`=`echo $VAL`
    export "`echo $CLE`"="`echo $VAL`"

    done <Fichier



    J'ai essayé export $CLE=$VAL
    ou alors export "`echo $CLE`"="`echo $VAL`"
    mais ca ne marche pas !!!

    quelqu'un peut me dire quelle est la bonne expression à utiliser ?
    d'avance Merci

    ps, shell = KSH. OS = SunOS 5.10 Sun-Solaris.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
     
    while read line
    do
            eval export $line
    done < filename

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
     
    while read line
    do
            eval export $line
    done < filename
    Edit : Juste pour être sûr... Ces variables "CLEE", tu veux les utiliser dans le script qui lit le fichier de définition, pas en dehors ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Par défaut
    Merci infiniment
    Oui je veux les utiliser dans le fichier appelant.

    l'erreur que j'avais provient du fait que j'utilise des noms de variables incorrectes

    CLE=PROCESS.DB.INSTANCE.LOGIN
    VAL=XXXXXXXX

    il fallait que je remplace les "." par des "_" =>
    CLE=PROCESS_DB_INSTANCE_LOGIN

    si non le shell ne les interprète pas correctement

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Le fait d'avoir des points dans les valeurs ne devrait rien changer. D'ailleurs chez moi ça marche bien même avec PROCESS.DB.INSTANCE.LOGIN

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Par défaut
    Merci encore

    Le fait de changer les "." en "_" génère l'erreur suivante :
    PROCESS.DB.INSTANCE.LOGIN =XXXXXXXX: is not an identifier

    aussi je bloque quand à la récupération des variables exportés en dynamique !

    c'est possible de mettre en ligne un exemple d'export et de récupération des données ?

    vraiment merci beaucoup

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ah ok. Dans ton exemple je croyais que la variable CLE était mise à PROCESS.DB.INSTANCE.LOGIN. Si par contre tu veux que PROCESS.DB.INSTANCE.LOGIN soit le nom de ta variable... Et bien ce n'est pas possible évidement, en shell les noms de variables ne peuvent pas contenir de points.

    Je ne comprend pas ce que tu entends par "récupération des variables exportés en dynamique" et par "exemple d'export et de récupération des données".

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Par défaut
    Bonjour,

    Le script principal appelle le scripte export.ksh qui va transformer le contenu d'un fichier plat en variables d'environnement.
    les variables ont la forme suivante :

    PROCESS.DB.INSTANCE.LOGIN
    PROCESS.DB.INSTANCE.PASSWORD

    Si :

    PROCESS=XX
    DB=YY
    INSTANCE=ZZ

    ma variable exportée sera : XX_YY_ZZ_LOIGIN=XXXXXXXXXXX
    et XX_YY_ZZ_PASSWORD=YYYYYYYYYYY

    comment récupérer le contenu de la variable XX_YY_ZZ_LOIGIN et XX_YY_ZZ_PASSWORD dans le script appellant ?

    encore merci beaucoup pour ton aide précieuse.

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Je peux t'aider mais va falloir que tu t'explique plus clairement, parce que je t'assure que ce n'est pas limpide ton histoire

    Apparament tu as deux scripts et un fichier. On va appeler les deux scripts "main.sh" et "export.sh". Le fichier s'appellera "flatfile". Si j'ai bien compris le script export.sh doit créer une variable d'environement qui s'appelle ${PROCESS}_${DB}_${INSTANCE}_LOGIN positionnée à XXXXXXXXXXX, et une autre variable qui s'appelle ${PROCESS}_${DB}_${INSTANCE}_PASSWORD positionnée à YYYYYYYYYYY. $PROCESS, $DB et $INSTANCE sont lus dans le fichier "flatfile". Ensuite tu veux récupérer les variables ${PROCESS}_${DB}_${INSTANCE}_LOGIN et ${PROCESS}_${DB}_${INSTANCE}_PASSWORD dans main.sh.

    Où prends-tu XXXXXXXXXXX et YYYYYYYYYYY ? Est-ce que ton fichier "flatfile" définit une seule fois PROCESS, DB et INSTANCE ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Par défaut
    imaginons le scénario suivant:

    Je rentre dans "main.sh", je determine la valeur des trois vriables PROCESS / DB / INSTANCE :
    imaginons :
    PROCESS=PROCESS1
    DB=DB2
    INSTANCE=INSTANCE3

    mon but est de détérminer ${PROCESS1_DB2_INSTANCE3_LOGIN} / ${PROCESS1_DB2_INSTANCE3_PASSWORD}


    .........
    J'appele "export.sh" qui va transformer le fichier plat "flatfile" tel qu'il est en variavles d'environnements
    "flatfile" contient toutes les combinaisons possibles PROCESS/DB/INSTANCE

    flatfile :
    PROCESS1_DB1_INSTANCE1_LOGIN=XX111
    PROCESS1_DB1_INSTANCE1_PASSWORD=YY111

    PROCESS1_DB1_INSTANCE2_LOGIN=XX112
    PROCESS1_DB1_INSTANCE2_PASSWORD=YY112

    PROCESS1_DB2_INSTANCE3_LOGIN=XX123
    PROCESS1_DB2_INSTANCE3_PASSWORD=YY123

    PROCESS5_DB9_INSTANCE7_LOGIN=XX597
    PROCESS5_DB9_INSTANCE7_PASSWORD=YY597
    .........


    retour au "main.sh", Comment je fais pour avoir la valeur de

    ${PROCESS1_DB2_INSTANCE3_LOGIN}
    ${PROCESS1_DB2_INSTANCE3_PASSWORD}

    en utilisant $PROCESS et $DB et $INSTANCE ??? (ca doit me retourner XX123 / YY123 )

    je dois faire quelque chose comme : (mais ca ne marche pas !!)
    $(${PROCESS}_${DB}_${INSTANCE}_LOGIN)
    $(${PROCESS}_${DB}_${INSTANCE}_PASSWORD)

    Merci

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    C'est une sorte de réentrance donc. On t'a déjà donné la solution dans la toute première réponse, celle qui ne corrigeait pas ton problème de point ("." est interdit dans le nom d'un symbol) mais qui simplifiait très grandement ton script.

    Tu fais
    eval \$${PROCESS}_${DB}_${INSTANCE}_LOGIN


    Au passage tu remarques que l'utilisation de {} est obligatoire parce que "_" est un caractère autorisé pour constituer un symbole shell.

    Cyril

  12. #12
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ah OK. Deux choses :

    1) Dans main.sh, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval LOGIN=$(echo \$${PROCESS}_${DB}_${INSTANCE}_LOGIN)
    Dans ton exemple ça va positionner LOGIN à la valeur XX123.

    2) Mais... Si tu te contenté d'exécuter export.sh dans main.sh, alors main.sh ne verra pas les valeurs que export.sh a positionné. La raison est simple : un process fils (export.sh) ne peut en aucun cas modifier l'environnement d'un process existant (en l'occurence son process père, main.sh). Un process ne peut que modifier son propre environnement, et éventuellement transmettre son environnement lors de la création d'un process fils (en "exportant" les variables à transmettre, avec export).

    Donc... Il ne faut pas que main.sh exécute export.sh. Il faut qu'il le source, comme ceci :
    Ou bien, ce qui est strictement équivalent mais moins standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    source /path/to/export.sh
    Quand un fichier est "sourcé", il est interprété par le shell courant au lieu d'être exécuté dans un shell fils. Donc dans ce cas main.sh récupèrera effectivement les variables positionnées par export.sh.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Par défaut
    Merci beaucoup, j'ai pu résoudre le problème
    Oui le "export.sh" est executé dans le même shell que le "main.sh"

    dans "export.sh" je fais : eval export $(Str_collapse "$line")
    dans le "main.sh" je fais :
    CPT=`eval echo '\$'${PROCESS}_${DB}_${INSTANCE}_LOGIN `
    MDP=`eval echo '\$'${PROCESS}_${DB}_${INSTANCE}_PASSWORD `

    Merci encore une fois

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/02/2005, 14h34
  2. Variables dynamiques
    Par CriPpLe dans le forum C++
    Réponses: 5
    Dernier message: 23/02/2005, 11h56
  3. [SQL SERVER 2000] Noms de variables dynamiques
    Par cassoulet dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/09/2004, 11h44
  4. Récupération de variables dynamiques complexes
    Par ludoboy dans le forum ASP
    Réponses: 7
    Dernier message: 24/05/2004, 17h51
  5. [LG]Problême Variable dynamique de types différents
    Par pierrOPSG dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2004, 16h01

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