Aller au contenu

Change
Bienvenue sur GeekZone
Inscrivez-vous sur GeekZone pour profiter des fonctions avancées du forum, proposer des news, participer aux conversations, ouvrir votre galerie, profiter de la messagerie interne et venir tester nos modérateurs avec du bon troll... Attention, ils ont la gâchette facile. C’est aussi pour ça que GeekZone est le meilleur site de passionnés depuis 2002 ! Si vous avez déjà un compte, connectez-vous - sinon, il est temps d'en créer un.

KSH : Problème d'evaluation des varialbes

- - - - -

  • Veuillez vous connecter pour répondre
6 réponses à ce sujet

#1
Rufh

Rufh

    Padawan Geek

  • Membre
  • PipPip
  • 201 messages
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.

#2
coccobill

coccobill

    Lord Jedi Geek

  • Membre
  • PipPipPipPip
  • 579 messages
  • Lieu:Nantes
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)

Modifié par coccobill, 17 March 2011 - 10:31.

Prawy do lewego
Wypij kolego
Przecież wiemy nigdy nie ma tego złego

#3
cben76

cben76

    Don't worry - Be happy

  • Membre
  • PipPipPipPipPipPipPip
  • 6138 messages
  • Lieu:Lyon
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.

Modifié par cben76, 17 March 2011 - 10:44.

Image IPBImage IPB

#4
Rufh

Rufh

    Padawan Geek

  • Membre
  • PipPip
  • 201 messages
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


#5
cben76

cben76

    Don't worry - Be happy

  • Membre
  • PipPipPipPipPipPipPip
  • 6138 messages
  • Lieu:Lyon
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.

Voir le messagecben76, le 17 March 2011 - 13:42, dit :

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.

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é.
Image IPBImage IPB

#6
Rufh

Rufh

    Padawan Geek

  • Membre
  • PipPip
  • 201 messages

Voir le messagecben76, le 17 March 2011 - 13:50, dit :

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

Merci ça marche.

#7
LoneWolf

LoneWolf

    Daily Geek Only

  • Membre
  • PipPipPipPipPipPip
  • 3687 messages
+1 avec cben.
J'ajouterais:

Voir le messageRufh, le 17 March 2011 - 13:26, dit :

variable='$HOME/toto'
echo $variable
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:
Image IPBImage IPB




0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)