Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/06/2011, à 10:38

roselangel

Nommer une variable avec une autre variable ? [Résolu]

Bonjour.
Je me demandais s'il était possible de nommer une variable en fonction de ce que contient une autre. Je m'explique :

#!/bin/bash
 # Cette fonction crée normalement un tableau contenant les objets présents dans chaque salle
objet_present_salle () {  

objets_$localisation=( $1 $2 $3 $4 $5 $6 $7 $8 $9 )

}

localisation='salle1'
objet_present_salle pain gourde
localisation='salle2'
objet_present_salle gateau t-shirt

Vous l'aurez compris, ma question porte sur le

objets_$localisation

qui fait tout planter. J'aimerais donc que le nom de la variable objet_$localisation change en fonction de ce que contient $localisation. Comment dois-je la nommer pour ce faire ?

Dernière modification par roselangel (Le 04/06/2011, à 11:32)

Hors ligne

#2 Le 02/06/2011, à 11:25

pode

Re : Nommer une variable avec une autre variable ? [Résolu]

En korn-shell :

$ cat v-dans-v.sh 
#!/bin/ksh
objet_present_salle () {  
NB_PARAMETRE=$#

set -A objets_$localisation
for (( i=1; i<=${NB_PARAMETRE}; i++ ))
do
  eval objets_$localisation[$i]=$1
  shift
done
}

localisation='salle1'
objet_present_salle pain gourde
typeset -n objets_nameref=objets_${localisation}
echo "On verifie le contenu de objets_\$localisation, avec localisation egal a $localisation : "${objets_nameref[@]}

localisation='salle2'
objet_present_salle gateau t-shirt
typeset -n objets_nameref=objets_${localisation}
echo "On verifie le contenu de objets_\$localisation, avec localisation egal a $localisation : "${objets_nameref[@]}

qui donne :

$ ./v-dans-v.sh 
On verifie le contenu de objets_$localisation, avec localisation egal a salle1 : pain gourde
On verifie le contenu de objets_$localisation, avec localisation egal a salle2 : gateau t-shirt

Hors ligne

#3 Le 02/06/2011, à 11:40

roselangel

Re : Nommer une variable avec une autre variable ? [Résolu]

D'accord. Sinon, vraiment aucun moyen pour le faire en bash ?

Hors ligne

#4 Le 02/06/2011, à 12:25

pode

Re : Nommer une variable avec une autre variable ? [Résolu]

C'est quasiment pareil, sauf que je n'arrive pas à afficher la contenu des variables objets_{salle1,salle2} en passant par la variable $localisation. Donc, c'est moins puissant.

$ cat v-dans-v-bash.sh 
#!/bin/bash
objet_present_salle () {  
NB_PARAMETRE=$#

for (( i=1; i<=${NB_PARAMETRE}; i++ ))
do
  eval objets_$localisation[$i]=$1
  shift
done
}

localisation='salle1'
objet_present_salle pain gourde
echo "objets_salle1 - localisation ecrite en dur - OK --"${objets_salle1[@]}"--"
objets_nameref=objets_${localisation}
eval echo "objets_salle1 - localisation accedee via un niveau d indirection - KO --"${!objets_nameref[0]}"--"

localisation='salle2'
objet_present_salle gateau t-shirt
echo "objets_salle2 - localisation ecrite en dur - OK --"${objets_salle2[@]}"--"
objets_nameref=objets_${localisation}
eval echo "objets_salle2 - localisation accedee via un niveau d indirection - KO --"${!objets_nameref[0]}"--"

qui donne :

$ ./v-dans-v-bash.sh 
objets_salle1 - localisation ecrite en dur - OK --pain gourde--
objets_salle1 - localisation accedee via un niveau d indirection - KO ----
objets_salle2 - localisation ecrite en dur - OK --gateau t-shirt--
objets_salle2 - localisation accedee via un niveau d indirection - KO ----

Hors ligne

#5 Le 02/06/2011, à 12:42

FRUiT

Re : Nommer une variable avec une autre variable ? [Résolu]

> \cat localiz
#!/bin/bash

localisation=( salle1 )
i=0

eval objets_${localisation[$i]}=\"\$1\"
eval echo \"objets_${localisation[$i]}\=\${objets_${localisation[$i]}}\"

> ./localiz pain
objets_salle1=pain
>

Dernière modification par FRUiT (Le 02/06/2011, à 12:55)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#6 Le 02/06/2011, à 13:08

FRUiT

Re : Nommer une variable avec une autre variable ? [Résolu]

avec la vraie indirection bash ${!var} :

> \cat localiz
#!/bin/bash

localisation=( salle1 salle2 salle3 )
i=2

eval objets_${localisation[$i]}=\"\$1\"

tmp="objets_${localisation[$i]}"
echo "objets_${localisation[$i]}=${!tmp}"

> ./localiz pain
objets_salle3=pain
>

Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#7 Le 02/06/2011, à 13:21

roselangel

Re : Nommer une variable avec une autre variable ? [Résolu]

Ca c'est sympa, seulement ça nécessite que localisation soit un tableau...

Hors ligne

#8 Le 02/06/2011, à 13:49

FRUiT

Re : Nommer une variable avec une autre variable ? [Résolu]

Ah oui tiens je me suis trompé de tableau lol...

Alors donx :

#!/bin/bash

objets_present_salle ()
{

    while [ "$1" ]; do
        eval objets_${localisation}+=\( \"\$1\" \)
        shift
    done

    eval numobjets=\"\${#objets_${localisation}[@]}\"

}

localisation=salle1
objets_present_salle "foo bar" baz qux

for (( i=0; i<$numobjets; i++ )); do
    objet="objets_${localisation}[$i]"
    echo "${!objet}"
done

Dernière modification par FRUiT (Le 02/06/2011, à 16:40)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#9 Le 02/06/2011, à 15:33

FRUiT

Re : Nommer une variable avec une autre variable ? [Résolu]

@pode

Bon je dis pas que c'est la seule erreur mais ceci ne peut pas fonctionner dans ton code :

echo "${!objets_nameref[0]}"

Tout simplement parce que l'élément 0 n'est pas défini dans ta boucle for ((i=1 ... Faudrait essayer avec un nombre plus grand, ou bien commencer d'indexer à 0.

for ((i=0; i<$NB_PARAMETRES; i++ ))

Sinon ça marche en faisant (pas besoin de eval avec l'indirection bash) :

objets_nameref="objets_${localisation}[1]"
echo "objets_salle2 - localisation accedee via un niveau d indirection - KO --"${!objets_nameref}"--"
objets_salle2 - localisation ecrite en dur - OK --gateau t-shirt--
objets_salle2 - localisation accedee via un niveau d indirection - KO --gateau--

D'ailleurs faudrait aussi revoir aussi les guillemets car dès qu'un argument a un espace ton code ne marche plus.

Dernière modification par FRUiT (Le 02/06/2011, à 15:55)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#10 Le 02/06/2011, à 18:12

pode

Re : Nommer une variable avec une autre variable ? [Résolu]

yep, ça va mieux avec ces correctifs smile

Hors ligne

#11 Le 02/06/2011, à 20:36

roselangel

Re : Nommer une variable avec une autre variable ? [Résolu]

Je suis désolé, je suis vraiment mauvais, mais je suis pas sûr d'avoir compris xD
Alors voici un autre exemple, peut-être un peu plus clair (pour vous, mais surtout pour moi)

objet_salle () {

case $localisation in
                     'salle1')
comp_objet_salle='absent' 
for objet in ${salle1[*]}
do
if [ $2 = $objet ] && [ $1 = 'comp' ] 
then
comp_objet_salle='present'
fi
done
;;
                     'salle2')
...
}

Voilà. Le code en lui même a peu d'importance. En gros localisation prend les valeurs 'salle1', 'salle2' etc... et je me sert respectivement des tableaux nommés salle1 salle2 etc... En réalité ma question est : comment je peux écrire ce code sans être obligé de détailler tous les "case" de la variable localisation ?

Hors ligne

#12 Le 03/06/2011, à 10:23

johndo

Re : Nommer une variable avec une autre variable ? [Résolu]

FRUiT a écrit :
    while [ "$1" ]; do
        eval objets_${localisation}+=\( \"\$1\" \)
        shift
    done

ou plus simplement :

eval "objets_${localisation}+=( \"\$@\" )"

Hors ligne

#13 Le 03/06/2011, à 13:01

FRUiT

Re : Nommer une variable avec une autre variable ? [Résolu]

C'est pas faux ^^


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#14 Le 03/06/2011, à 13:36

pode

Re : Nommer une variable avec une autre variable ? [Résolu]

Script (avec des echo uniquement pour valider que ça marche) :

#!/bin/bash
objet_present_salle () {  
echo "Objets presents en salle ${localisation} : $@"
eval "objets_${localisation}=( \"\$@\" )"
}

objet_salle () {
# parametres en entree
NATURE_TEST=$1
shift
OBJET_A_TESTER="$1"

# initialisations
comp_objet_salle=absent 
eval numobjets=\"\${#objets_${localisation}[@]}\"

for (( i=0; i<$numobjets; i++ ))
do
  objet="objets_${localisation}[$i]"
  if [[ ${OBJET_A_TESTER} = ${!objet} && ${NATURE_TEST} = comp ]] 
  then
    comp_objet_salle=present
  fi
done

echo "Objet ${OBJET_A_TESTER} ${comp_objet_salle} en salle ${localisation}"
}

# inits
localisation=salle1
objet_present_salle pain gourde
localisation=salle2
objet_present_salle gateau t-shirt 'canif bouteille'

# tests
localisation=salle1
objet_salle comp pain
objet_salle comp raisin

# tests
localisation=salle2
objet_salle comp 'canif bouteille'
objet_salle comp pastis

Et test :

$ ./salle.sh 
Objets presents en salle salle1 : pain gourde
Objets presents en salle salle2 : gateau t-shirt canif bouteille
Objet pain present en salle salle1
Objet raisin absent en salle salle1
Objet canif bouteille present en salle salle2
Objet pastis absent en salle salle2

Hors ligne

#15 Le 04/06/2011, à 11:32

roselangel

Re : Nommer une variable avec une autre variable ? [Résolu]

D'accord. C'est plus clair maintenant. Merci à tous !

Hors ligne