#1 Le 02/06/2011, à 09: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, à 10:32)
Hors ligne
#2 Le 02/06/2011, à 10: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, à 10: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, à 11: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, à 11: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, à 11: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, à 12: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, à 12: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, à 12: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, à 15: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, à 14: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, à 14: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, à 17:12
- pode
Re : Nommer une variable avec une autre variable ? [Résolu]
yep, ça va mieux avec ces correctifs
Hors ligne
#11 Le 02/06/2011, à 19: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, à 09:23
- johndo
Re : Nommer une variable avec une autre variable ? [Résolu]
while [ "$1" ]; do eval objets_${localisation}+=\( \"\$1\" \) shift done
ou plus simplement :
eval "objets_${localisation}+=( \"\$@\" )"
Hors ligne
#13 Le 03/06/2011, à 12: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, à 12: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, à 10:32
- roselangel
Re : Nommer une variable avec une autre variable ? [Résolu]
D'accord. C'est plus clair maintenant. Merci à tous !
Hors ligne