KSH : Problème d'evaluation des varialbes

Bonjour,

J’ai un petit souci. J’ai un fichier paramètre que je parcours avec un while pour en récupérer les paramètre nécessaire à l’exécution d’un script.
Dans ce fichier j’ai des chemins de définis pour la création de fichiers log, travail …
Le soucis c’est que j’aimerais pouvoir mettre par exemple $HOME/travail dans mon fichier paramètre mais cela ne fonctionne par car il ne substitut pas $HOME par /usr/toto par exemple.
Voila un exemple du fichier paramètre :
Code :

blablabla

log_dir=$HOME/travail/log
work_dir=$HOME/work

blablabla

Et la boucle que j’utilise pour le décodage :

Code :

while read line
do

	# Remove the carriage return from $line
	line=`echo $line | tr -d '\r\n'`
	# decode the line
	field=`echo $line | awk -F "=" '{print $1}'`
	value=`echo $line | awk -F "=" '{print $2}'`

	case $field in 
		log_dir ) dirlog=$value;;
		work_dir ) dirwork=$value;;
		...
	esac

done < $parameter_file

Dans l’état actuel si j’affiche dirlog j’obtiens:
Code :

echo $dirlog
$HOME/travail/log

Alors que je souhaite /usr/toto/travail/log

J’espère que j’ai été assez clair.

Qui aurait une solution svp ?
Merci.

PS : Si cette réponse a déjà été donnée désolé pour le doublon, mais je ne l’ai pas trouvée.

Je réponds peut-être à côté mais pourquoi tu ne mets pas dans ton fichier de config directement

dirlog=$HOME/travail/log
dirwork=$HOME/work

Et, au début de ton script :

. $parameter_file (si tu es en ksh, sinon voir les man)

c’est un problème de visibilité des variables.

Dans un script, la declaration des variables n’est valable que dans l’environnement du script.
Donc soit tu declares tes variables dans ton script (ou tu appelles ton ksh qui contient la declaration) pendant l’execution de ton script, comme proposé par cocobill, soit tu etends la visibilité de tes variables au système, en rajoutant “EXPORT” devant la declaration de tes variables dans ton script, et la modification du contenu de ta variable sera valable en dehors de l’execution de ton script.

Les deux solutions sont valables, tout depends de ce que tu veux faire. Si tu as besoin de modifier tes repertoires uniquement pendant l’execution de ton script, c’est la solution 1, mais si tu veux déclarer des variables d’environnement, c’est la solution 2.

Je précise mon besoin.
Le fichier qui contient les paramètres est en fait un autre script que je ne veux pas lancer d’où mon parcours de celui-ci par une boucle while pour récupérer les paramètres qui m’intéresse.
Seulement voila dans celui-ci les chemins sont donné en $HOME/… et je n’arrive donc pas à les utiliser car il n’interprète pas les variables.
D’où ma question comment puis-je lui faire interpréter les variables afin que si je lis $HOME/travail/log je puisse stocker dans ma variable : /usr/toto/travail/log

Merci de votre aide.

Ps : Si vous voulez tester cela le plus facile est de faire ceci :

variable='$HOME/toto'
echo $variable

ha ok, je comprends mieux, c’est l’interprétation des variables que tu récupères que tu veux forcer.

Essaye de regarder du coté de eval(), en mettant un truc du genre dirlog = eval($value);;, en espérant que ta variable $home contenu dans ton $value est une porté suffisante pour avoir une valeur dans ton contexte d’exécution.

De memoire, ca devrait fonctionner, mais c’est la direction : forcer l’evaluation d’expression contenu dans des variables.

[quote=“cben76, post:5, topic: 52340”]
ha ok, je comprends mieux, c’est l’interprétation des variables que tu récupères que tu veux forcer.

Essaye de regarder du coté de eval(), en mettant un truc du genre dirlog = eval($value);;, en espérant que ta variable $home contenu dans ton $value est une porté suffisante pour avoir une valeur dans ton contexte d’exécution.

De memoire, ca devrait fonctionner, mais c’est la direction : forcer l’evaluation d’expression contenu dans des variables.
[/quote]

C’est bon, c’est bien ca, mes souvenirs sont bon ^^
On doit pouvoir faire plus simple, mais le code ci dessous fonctionne :

xxx:~$ v_ess='$HOME/toto'
xxx:~$ echo $v_ess
$HOME/toto

–> Ton problème ici, $HOME est pas evalué

Le truc qui marche avec eval :

xxx:~$ v_ess=`eval "echo $HOME/toto"`
xxx:~$ echo $v_ess
/home/ben/toto

Donc ca fonctionne. A creuser maintenant pour faire un truc carré.

Merci ça marche.

+1 avec cben.
J’ajouterais:

Ca, ca marche pas.
Rappel:
" interprète les variables mais pas les expressions de recherche (style $(HOME#txt))
’ interprète rien.

Je modifie le code

while read line
do

	# Remove the carriage return from $line
	line=`echo $line | tr -d '\r\n'`
	# decode the line
	field=`echo $line | awk -F "=" '{print $1}'`
	value=`echo $line | awk -F "=" '{print $2}'`

	case $field in 
		log_dir ) eval("dirlog=$value");;
		work_dir ) eval("dirwork=$value");;
		...
	esac

done < $parameter_file

Note: SECURITY WARNING
Le moindre truc style « rm -Rf / » dans ton fichier de variables et c’est pas cool…

Je dis ca, je dis rien :teehee:

LoneWolf
Le bash, c’est facile, sauf quand on essaye de faire des trucs crades… :ninja: