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

Linux Discussion :

Variable dynamique possible ?


Sujet :

Linux

  1. #1
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut Variable dynamique possible ?
    Bonjour,

    je souhaite faire une variable dynamique, c'est à dire que son nom dépend d'une notre variable...

    exemple:

    toto=nom_suffixe
    pers_$toto=ok
    tata=${pers_$toto}

    je souhaite que :
    "echo $pers_nom_suffixe" retourne "ok" ...
    "echo $tata" retourne "ok" aussi ...

    Y a-t-il moyen de faire des manipulations de ce type ?
    Merci d'avance.

    PS:
    je suis sous ksh sous SunOS

  2. #2
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    si vous connaissez d'autres moyens pour faire les exemples, je suis preneur aussi !

    avec $() et `` et une commande echo ou autre...


  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Merci de préciser le shell dans lequel tu souhaites faire ca (bash, ksh, sh, zsh, csh, ...)
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    heu... c'est marqué dans le PS ...

    Mais je l'écris à nouveau:

    shell ksh sous SunOS 5.9

    si vous avez une piste, une solution de contournement, ou si cela semble impossible simplement, n'hésitez pas !

  5. #5
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    bonjour,
    pourquoi ne pas simplement faire un tableau ?
    J'ai vu cette question, que je trouve assez tordu, venir dans différents langage et ça c'est toujours résolu par un tableau.

  6. #6
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    heu... un tableau...

    avec un nom fixe, et pour chaque case une variable en identifiant, avec la valeur associé... mouai... ça casse un peu beaucoup la lisibilité du code tout de même !

    moi j'avais une vision du script shell unix super puissant... et je trouve bizarre qu'il n'y est pas une façon de l'écrire pour que cela fonctionne... déçu tout même !

    je préfère encore faire mes scripts comme cela, et avoir une moulinette qui renomme la chaîne "$toto" en "nom_suffixe" avant de l'éxécuter...

    si quelqu'un à une piste là dessus, je suis preneur aussi...
    le but, parcours de tous les fichiers d'un et sous répertoire, et remplacer une chaine par une autre dans ces fichiers...
    faisable ça non ?

  7. #7
    Membre confirmé
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Points : 497
    Points
    497
    Par défaut
    oui tu peux modifier les fichiers à la volée bien sur exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #!/bin/ksh
    chainerecherchee=`....`
    chainederemplacement=`....traitement/convertion du contenu de chainerecherchée...`
    for i in * ; do vi -c "s/$chainerecherchée/$chainederemplacement/|:wq" $i ; done
    pour ton histoire de variable à nom nonfixé à l'avance ça n'existe dans aucun langage même de haut niveau que ce soit en C Clipper ou autre à ma connaissance... alors en langage interprété et donc en shell encore moins...

    la seule façon propre de le faire est un tableau de variable

    $variable[$indicateur]=contenu
    $compteur[$carrotes]=10
    ou les $carrotes $patates etc... sont des constantes prédéfinies ce qui est donc un contournement et aussi une aberation d'un point de vue algorythme...
    Comité de lutte contre le langage SMS sur les forums
    Veuillez écrire dans un langage compréhensible par les humains, merci.

  8. #8
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Il me semble que cette technique n'a aucun intérêt et n'ajoute en rien de la lisibilité
    Explique nous pourquoi tu as a besoin de faire ça ?

  9. #9
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    bster>
    merci pour ton exemple, je vais voir ce que cela peut donner...
    sinon, il me semble qu'en php, il y a moyen de faire cela... en tout cas, dans les autres languages, il y a les structures qui peuvent servir pour améliorer la modularité.

    narmataru>
    imagine tout un tas de script qui gère et utilise une instance oracle.
    avec des variables générales donnant le chemin de log oracle de cette instance, ou des variables générales utilsés par les scripts de cette instance.
    et ensuite, finalement, tu as plusieurs instances oracle sur la même machine... tu te retrouves avec des scripts non modulaire, à revoir pour la nouvelle instance...
    de plus, tu souhaites avoir une dupplication des scripts, car chaque instance ne correspond pas à la même version de l'appli, ni à la même version des script d'exploitation...
    tu vois la problèmatique ?

    edit: ortho

  10. #10
    Membre confirmé
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Points : 497
    Points
    497
    Par défaut
    Citation Envoyé par dug
    bster>
    merci pour ton exemple, je vais voir ce que cela peut donner...
    sinon, il me semble quand php, il y a moyen de faire cela... en tout cas, dans les autres languages, il y a les structures qui peuvent servir pour améliorer la modularité.

    narmataru>
    imagine tout un tas de script qui gère et utilise une instance oracle.
    avec des variables générales donnant le chemin de log oracle de cette instance, ou des variables générales utilsés par les scripts de cette instance.
    et ensuite, finalement, tu as plusieurs instances oracle sur la même machine... tu te retrouves avec des scripts non modulaire, à revoir pour la nouvelle instance...
    tu vois la problèmatique ?
    Je vois ce que tu veux dire mais alors pourquoi ne pas simplement utiliser des fichiers avec les listes de constantes tout simplement ?

    ainsi ton script va voir ce voir ce fichier le trier et y trouver les instances que tu dois gerer...

    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for i in `cat liste instance_prod` ; do 
    sqlplus $truc@machin........... ; done
    ou mieux encore utiliser se principe pour joindre un fichier formaté avec des séparateurs pour avoir une liste des bases/instances/logins/passwords/ ou tes scripts iront piocher l'info voulu au temps voulu....

    un fichier qui ressemblerai à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xdm:TEST:system:sysbxhar
    machine3:B_dev:system:systruc
    machine18:O_TRUC:system:sysusdar
    comme ça tu peux être tranquile et résoudre ton problème sans utiliser de variable à nom variable
    Comité de lutte contre le langage SMS sur les forums
    Veuillez écrire dans un langage compréhensible par les humains, merci.

  11. #11
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    humm...

    enfait, c'est pas une gestion multi instance tout auto qui est souhaité.
    c'est surtout une dupplication des scripts d'exploit, mais qu'ils soient suffisamment générique pour ne pas avoir à bidouiller les scripts.

    par contre, un fichier contenant les variables et valeur peut effectivement être utile, faut que je réfléchisse...

    bon, de toute façon, c'est bien dommage qu'il n'y est pas de solution simple, mais c'est comme cela...
    chez mon client, l'arborescence des bases données peuvent changer, suivant la version de la méthodologie, donc forcément, un seul endroit à modifier serait beaucoup plus pratique, c'est ça la vrai modularité...

    en tout cas, merci à vous deux ! je vais chercher une solution de contournement parmi toutes les pistes que j'ai...

    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
     
    # Definition des repertoires oracle
    export PATH_${ORACLE_SID}=/data/ora/instance_toto
     
    # Definition du repertoire des scripts d'administration
    export ADMIN_${ORACLE_SID}=${PATH_${ORACLE_SID}}/adm/dba
     
    # Definition du repertoire des logs d'administration
    export LOG_${ORACLE_SID}=${PATH_${ORACLE_SID}}/adm/dbalog
     
    # Definition du fichier de trace d'exploitation
    export EXPLOIT_${ORACLE_SID}=${LOG_${ORACLE_SID}}/Exploit_${ORACLE_SID}.log
     
    # Definition du repertoire oracle contenant la config de la base
    export INIT_${ORACLE_SID}=${PATH_${ORACLE_SID}}/u01/pfile

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 111
    Points
    111
    Par défaut
    Pour ceux que ça intéresse, je pense que la réponse est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var1=coucou
    var2=foo
    var3=bar
    total=3
    for i in $(seq 1 $total); do
    mavar="var"$i
    echo ${!mavar}
    done;
    Michaël, développeur 2.0 et demi,
    http://www.bacchanales-prod.fr

  13. #13
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Je le vois plutôt comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    suffix='suffix'
    prefix='prefix'
     
    valeur='foo bar'
     
    eval "${prefix}_${suffix}=\"$valeur\""
     
    var=$(eval 'echo ${'${prefix}_${suffix}'}')
     
    echo $prefix_suffix # donne foo bar
    echo $var # donne aussi foo bar
    mais chacun voit midi à 14heures

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 111
    Points
    111
    Par défaut
    ma méthode marche (en tout cas avec ma config serveur), mais la tienne est peut-être mieux en ce qui concerne les "règles de l'art" ? Je suis néophyte en script shell :/

    Autre chose qui peut servir et qui est vaguement relié à la discussion (pendant qu'on y est) : pour avoir un script (script.sh) et son fichier de conf (conf-script.sh), il suffit de taper la ligne "source conf-script.sh"

    Cela à pour effet donc d'exécuter le fichier conf-script.sh et de conserver les variables créées (dites moi si je me trompe)
    Michaël, développeur 2.0 et demi,
    http://www.bacchanales-prod.fr

  15. #15
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Concombre Masqué Voir le message
    ma méthode marche
    Elle donne effectivement un résultat... sans message d'erreur... mais je ne vois pas en quoi elle crée des variables dynamiquement.
    D'après ce que j'ai compris du fil, le PO voulez avoir une variable dont le nom dépend de la valeur d'une autre variable.
    Par exemple, si tu as suffix='_toto' il veut pouvoir créer la variable var_toto et bien sûr l'utiliser.
    Maintenant il est possible que je n'ai rien compris...
    En relisant ta proposition je m'apperçois qu'on peut améliorer la miène en passant par une variable temporaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    suffix='suffix'
    prefix='prefix'
    valeur='foo bar'
     
    eval "${prefix}_${suffix}=\"$valeur\""
     
    tmp="${prefix}_${suffix}"
    var=${!tmp}
     
    echo $prefix_suffix # donne foo bar
    echo $var # donne aussi foo bar
    Citation Envoyé par Concombre Masqué Voir le message
    mais la tienne est peut-être mieux en ce qui concerne les "règles de l'art" ?
    Non non, je ne garantis rien là-dessus.

    Citation Envoyé par Concombre Masqué Voir le message
    Autre chose qui peut servir et qui est vaguement relié à la discussion (pendant qu'on y est) : pour avoir un script (script.sh) et son fichier de conf (conf-script.sh), il suffit de taper la ligne "source conf-script.sh"
    Cela à pour effet donc d'exécuter le fichier conf-script.sh et de conserver les variables créées (dites moi si je me trompe)
    Ça a l'air bon... j'utilise plutôt la syntaxe (attention à ne pas oublier le point):
    Aucune idée sur la portabilité...

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 111
    Points
    111
    Par défaut
    mea culpa, j'ai mal formulé.

    Ce que j'ai écrit permet de "lire" des variables de manière dynamique. J'en avais besoin car au boulot il me fallait un script avec un fichier de configuration (c'est mieux) pour des variables comme user, pass, host, db et une liste de tables, avec les champs, et d'autres bricoles.

    Dans mon fichier de conf donc à un moment j'ai :

    table1_name=t1
    table1_fields=f1,f2,f3
    table1_outfile=premiere.csv
    table2_name=unautrenom
    table2_fields=nomduchamp, fieldname, blabla, foo, bar
    table2_outfile=seconde.csv
    nbr_table=2
    et ensuite je fais une boucle pour exporter en csv (j'écrit de tête, il peut y avoir des erreurs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(i in $(seq 1 $nbr_table); do
    dyn_t_name="table"$i"_name"
    table_name=${!dyn_table_name}
    table_fields=${!dyn_table_fields}
    dyn_t_fields="table"$i"_fields"
     
    outfile="${!"table"$i"outfile"}
     
    sql="select "$table_fields" from "$table_name" into outfile \""$outfile"\""
    echo $sql|mysql $bd -u$user -p$pass -h$host
    gzip -f "$outfile"
     
    done;
    Je répond donc à la problématique "comment faire un genre de tableau multidimensionnel maladroitement mais pour dépanner"
    Michaël, développeur 2.0 et demi,
    http://www.bacchanales-prod.fr

  17. #17
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Ma solution dégueulasse en zsh (et ksh)
    Bonjour, je suis tombé sur ce sujet en cherchant une solution à ce besoin en zsh (ordinairement je fais du bash et ça passe tout seul).
    J'ai testé en ksh et cela fonctionne également.
    J'ai eu besoin de cela pour déclarer des variables avec valeur "true" si l'opérateur a cliqué sur une case à cocher proposée par whiptail.
    Farfelu ok mais c'est une maintenance vite fait pour ajouter des menus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a=toto
    eval "$a=true"
    echo $a
    -> toto

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    r=$(eval "echo \$$a")  
    echo $r
    -> true

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $(eval "echo \$$a")
    -> true

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/04/2007, 09h56
  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