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 :

Contenu d'une variable qui est elle même variabilisée en partie


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 22
    Points
    22
    Par défaut Contenu d'une variable qui est elle même variabilisée en partie
    Bonjour,

    Je suis persuadé que c'est tout simple en tout cas en bash c'est le cas, il suffit d'utiliser le ! je crois mais en ksh, je n'ai pas encore trouvé la solution.

    Voici mon problème.

    J'ai une variable ORA1231USER qui contient user. (export ORA1231USER=user).
    J'ai une autre variable PRD qui contient 123. (export PRD=123).

    Je voudrais pouvoir faire un sqlplus ${ORA${PRD}1USER}/.... le ${PRD} soit interprété avant le ${ORA....1USER}. Voilà est-ce possible et comment ?

    D'avance merci pour votre aide.

    Sam

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

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

    si tu veux de la modularité dans le nommage de tes variables, utilise un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ declare -a oraUsers
    $ oraUsers=( user_1 user_2 ...)
    $ echo "${oraUsers[1]}
    user_2
    voire un tableau associatif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ unset oraUsers
    $ declare -A oraUsers
    $ oraUsers[titi]="user_1"
    $ oraUsers[toto]="user_2"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ oraUsers=( [titi]=user_1 [toto]=user_2 )
    note que seuls les tableaux indexés sont triés.

  3. #3
    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
    Points : 7 842
    Points
    7 842
    Par défaut
    Si tu es en ksh93, tu peux utiliser l'approche de N_Bah, en remplaçant le "declare" qui est du bash par "typeset".

    Si tu es en ksh88, ton shell n'a pas de support pour les tableaux, tu peux quand même t'en sortie avec "eval" mais à condition de blinder ton code et en particulier la variable PRD contre les vulnérabilités associées à "eval".

    Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ PRD=123
    $ ORA1231USER=test
    $ echo ORA${PRD}1USER
    ORA1231USER
    $ echo $(eval echo \$ORA${PRD}1USER)
    test

  4. #4
    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
    Points : 5 851
    Points
    5 851
    Par défaut
    Une solution un peu moins vulnérable, me semble-t-il (et que l'on peut probablement écrire plus simplement (avec un seul sed?)):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ PRD=123
    $ ORA1231USER=test
    $ echo ORA${PRD}1USER
    ORA1231USER
    $ set | egrep "^ORA${PRD}1USER=" | sed "s/ORA${PRD}1USER=//"
    test
    En blindant la variable PRD contre les vulnérabilités associées à "sed"... s'il y en a...

    Rq: cette méthode peut partiellement échouer si on s'amuse à créer des variables comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Z=$(echo -e "\nORA1231USER=autre")
    mais faudrait vraiment le faire exprès...

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Merci pour la réponse rapide mais je ne vois pas l'intérêt de passer par un tableau... mais si tu me réponds ceci, je vois 2 solutions:
    - Nous n'avons pas le choix... on ne peut pas s'en sortir avec des "eval" ou des parenthèses bien placés "(" avec des "\" ...
    - J'ai mal exprimés mon besoin

    Le script qui appelle le sqlplus a pour mission d'êre utilisé sur plusieurs environnements. Un environnement est différencié par la vairable PRD... Chaque environnement a un PRD différent et chaque environnement à la variable ORA${PRD}1USER défini par les personnes qui ont créés l'environnement.

    Environnement 1 :
    PRD=123
    ORA1231USER=users1

    Environnement 2 :
    PRD=456
    ORA4561USER=users2

    Je dois écrire un script quoi doit pouvoir fonctionner sur l'environnement 1 et 2... donc je pourrais faire les lignes ci-dessous mais je ne trouve pas ça très joli... et si on rajoute un autre environnement je dois retoucher le script...
    if [ "x${PRD}" == "x123" ]
    then
    sqlplus ${ORA1231USER=/...
    fi
    if [ "x${PRD}" == "x456" ]
    then
    sqlplus ${ORA4561USER=/...
    fi

    Je voudrais partir sur un truc générique qui marche à tous les cous et qui ne contient pas de if... (surtout que fonctionnellement un environnement est toujours construit sur le même principe)

    sqlplus sqlplus ${ORA${PRD}1USER}/....

    Est-ce plus clair ?

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Super merci jlliagre et jack-ft c'est exactement ce que je voulais.

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 301
    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 301
    Points : 12 789
    Points
    12 789
    Par défaut
    Bonjour,
    Citation Envoyé par jlliagre Voir le message
    Si tu es en ksh93, tu peux utiliser l'approche de N_Bah, en remplaçant le "declare" qui est du bash par "typeset".

    Si tu es en ksh88, ton shell n'a pas de support pour les tableaux, tu peux quand même t'en sortie avec "eval" mais à condition de blinder ton code et en particulier la variable PRD contre les vulnérabilités associées à "eval".

    Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ PRD=123
    $ ORA1231USER=test
    $ echo ORA${PRD}1USER
    ORA1231USER
    $ echo $(eval echo \$ORA${PRD}1USER)
    test
    Est-ce que l'indirection de variable (qui me semble plus propre) ne fonctionnerait pas sous KSH (88 ou 93) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ PRD=123
    $ ORA1231USER=test
    $ VAR=ORA${PRD}1USER
    $ echo ${!VAR}
    test

  8. #8
    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
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Est-ce que l'indirection de variable (qui me semble plus propre) ne fonctionnerait pas sous KSH (88 ou 93) ?
    NON!
    Je confirme de mémoire (douloureuse) que certains ksh n'acceptent pas cette syntaxe (malheureusement, je n'ai plus les références de ces ksh).

  9. #9
    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
    Points : 7 842
    Points
    7 842
    Par défaut
    ${!xxx} est un bashisme qui n'est à ma connaissance implémenté dans aucune version de ksh ou de zsh.

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 301
    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 301
    Points : 12 789
    Points
    12 789
    Par défaut
    Exact, en faisant quelques recherches il semblerait que les règles sont:

    KSH88 et avant ==> via eval

    KSH93 (ne fonctionne pas avec des variables de position de paramètres):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ foo=bar
    $ typeset -n var=foo
    $ echo ${var}
    bar
    zsh:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ foo=bar
    var=foo
    echo ${(P)var}
    bar
    Bah, maintenant, je saurais qu'il ne faut surtout pas utiliser ce type d'indirection si on veut pouvoir être portable

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/11/2010, 17h12
  2. acceder à une variable qui est dans une condition
    Par Snipy dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2009, 12h39
  3. Réponses: 17
    Dernier message: 05/02/2009, 15h48
  4. Accéder à une variable qui est dans une string
    Par ploxien dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2007, 14h48
  5. Contenu d'une variable qui disparait :/
    Par Aleksis dans le forum C++
    Réponses: 10
    Dernier message: 02/06/2006, 15h50

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