[Linux] Question bash - creation de variable

Daniel Huhardeaux daniel.huhardeaux@::1
Dim 29 Juin 18:38:49 CEST 2008


Jean BENOIT a écrit :
> Re,
>
> On Sat, Jun 28, 2008 at 04:00:41PM +0200, Daniel Huhardeaux wrote:
> [...]
>> environnement. Le contenu de ces variables peut également avoir été 
>> modifié au préalable par un:
>>
>> ${prefix1}VAR$p=$(/bin/cat ${prefix1}VAR$p)
>
> Ça aussi, ça devrait marcher avec un eval.
>
>     eval ${prefix1}VAR$p=$(/bin/cat ${prefix1}VAR$p)
>
> Remarque : attention au backquotes dans prefix1.
> Ça peut être un trou de sécurité.
> Il faut nettoyer prefix1 de tout caractère suspect : [`$\(){}'"] etc.
> Si prefix1 est figé par ton programme, pas de souci.
> Par contre, s'il peut être fourni en paramètre, le nettoyage est nécessaire.
>
> [...]
>> Le but est de stocker des valeurs de variables qui doivent être non 
>> volatiles et pouvoir récupérer ces valeurs en cas d'arrêt ou crash de 
>> l'application ou extinction de la machine.
>
> Ça fonctionne avec eval :
>
>     for p in $LISTE; do
> 	eval ${prefix1}VAR$p="default"
> 	export ${prefix1}VAR$p
>     done
>
> Il faut simplement sourcer le script pour que les variables fassent parti
> de l'environnement :
>
>     . /le/chemin/du/script_qui_initialise_les_variables
Bonjour,

j'ai repris le script avec eval et je n'avance pas plus. Reprenons 
l'exemple:

#!/bin/bash

cat=/bin/cat
echo=/bin/echo
path2nonvolatiles=/home/dh/tmp/variables.nonvolatiles
backupIFS=$IFS
PREFIX=HIT_ENV_
eval ${PREFIX}ROOMS='101\ 103\ 104'
ROOMS="101 103 104"

#IFS=";"
$echo ${PREFIX}ROOMS
$echo "$ROOMS"

for p in $ROOMS; do
    $echo $p
done

IFS=$backupIFS

Le resultat a l'execution est:

stryx:~/bin$ ./test.sh
HIT_ENV_ROOMS          <- contenant ${PREFIX}ROOMS
101 103 104            <- contenu $ROOMS
101                    <- enumeration du contenu, boucle for
103
104

Si je n'échappe l'espace dans eval [...] soit donc eval 
${PREFIX}ROOMS='101 103 104', j'obtiens a l'execution:

./test.sh: line 9: 103: command not found    <- bash execute le contenu!
HIT_ENV_ROOMS
101 103 104
101
103
104

et ce même si IFS est positionné à ; ou virgule par ex. ou que je 
remplace l'espace par un ; ou une virgule sans modifier IFS. Enfin, 
comme le contenu est executé au lieu d'être affiché, cela ne m'aide pas 
beaucoup ;-) un echo ${PREFIX}ROOMS et la boucle sortant tous deux cette 
même erreur.

Donc j'arrive à mes fins en figeant le nom des variables mais toujours 
pas si je veux les préfixer/suffixer

Jean Marc: l'export doit être réalisé après avoir initialisé les 
variables avec les valeurs par défaut, puis avoir récupéré la valeur de 
cette même variable stockée dans le répertoire. Ta procédure d'export 
-que je n'ai pas testée- devra donc être

export eval ${prefix1}VAR$p=$(/bin/cat ${prefix1}VAR$p)

Merci pour vos idées.

-- 
Daniel  Huhardeaux       _____ ____ ____ _____ _____ _
enum    +33 368 460 088 (_  __) _  ) _  (_  __) _  _(_)  +48 22 489 9531
iaxtel   1-700-849-6983  / / / // / // / / / / /_/ / /
sip/iax:callto  101@::1/_/ ( ___( ___/ /_/ (_/ (_/_/.net    FWD# 422493



Plus d'informations sur la liste de diffusion linux