encore un pb de script shell.... - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 27-04-2004 à 13:11:14
Je me lance ... Voici le résultat :
master=titi
slave=tutu
arg1=master
eval HOSTNAME=$`echo $arg1`
echo $HOSTNAME
Apparemment, ça fonctionne.
Marsh Posté le 27-04-2004 à 14:07:18
chapeau bas!!!! pourtant j'avais essayé avec des `` mais pas avec eval
v voir en détails a quoi ca sert...
merci bien!!
Marsh Posté le 27-04-2004 à 15:37:24
alors... encore plus vicieux... (et encore un copu j'y arrive pas tout seul...) mais bon là, c'est plus que ca m'énerve de pas arriver a la faire comme je veux!
I=0
while [ "X${eval $`echo "ETH_${I}_0"`}" != "X" ]; do
eval ETH_`echo $I`_0=$`echo "${A}_ETH_`echo $I`_0"`
echo "ETH_`echo $I`_0=${ETH_`echo $I`_0}"
...
I++
done
en gros, j'ai des variables MASTER_ETH_x_y et SLAVE_ETH_x_y (où x et y peuvent varier) et je voudrais, une fois que je sais si j'ai a faire a master ou a slave tout recopier dans des variables ETH_x_y
bon là y'a que le x, mais déjà ca marche pas...
bon, sinon, je ferais sans, mais ca sera largement moins beau et moins extensible...
alors yannigperr t'a une idée de comment faire ce truc tordu?
(bon les autres aussi ont le droit de répondre, mais tu m'a l'air de bien tater en shell...)
Marsh Posté le 27-04-2004 à 16:08:39
yes ca marche!!!!
I=1
eval `echo "ETH_${I}_0"`=$`echo "${A}_ETH_${I}_0"`
echo "MASTER_ETH_1_0=$MASTER_ETH_1_0"
echo "ETH_1_0=$ETH_1_0"
Marsh Posté le 27-04-2004 à 16:24:35
rah, sauf que pour insérer ca dans un while (ou dans un echo)... le eval dans le while... ?!?!?!
Marsh Posté le 27-04-2004 à 17:08:49
bon, je patoge...
si kkn a une idée de pourquoi ca:
I=1
echo "`eval `"ETH_${I}_0="``${`eval `"ETH_${I}_0"``}"
ne marche pas...
sachant que le but est d'avoir un:
echo "ETH_1_0=${ETH_1_0}"
???
Marsh Posté le 28-04-2004 à 08:55:15
Euh, tu pourrais pas utiliser un tableau plutôt ?
C'est pratique un tableau ... La seule restriction est que tu ne peux utiliser un tableau d'une dimension. Mais à la limite, tu peux utiliser une asture de ce genre :
let index=i+(j*10) # pour un tableau de largeur 10
tab[$index]="mon bordel"
intégrer dans un truc du genre :
for i in 1 2 3
do
for j in 1 2
do
let index=i+(j*10)
tab[index]="mon bordel"
done
done
Le parcours d'un tableau :
i=0
for elt in ${tab[ *]}
do
let i=$i+1
echo "$i : $elt"
done
Pour info, echo "`eval `"ETH_${I}_0="``${`eval `"ETH_${I}_0"``}" ne peut fonctionner puisque tu ne peux pas imbriquer plusieurs '``' ...
Marsh Posté le 28-04-2004 à 09:46:07
ok, merci pour l'info a propos de l'imbrication des `` ceci explique beaucoup de choses quand au comportement non désiré de mon script...
je vais voir pour le tableai, je crois quand même que je vais encore batailler un petit peu...
Marsh Posté le 28-04-2004 à 09:46:32
ok, merci pour l'info a propos de l'imbrication des `` ceci explique beaucoup de choses quand au comportement non désiré de mon script...
je vais voir pour le tableai, je crois quand même que je vais encore batailler un petit peu...
Marsh Posté le 28-04-2004 à 09:58:04
Bon, je crois que je vais laisser tomber...
domage car là:
Code :
|
je pense que je suis vraiment pas loin... le eval marche, le echo aussi, juste la condition du while qui merdoie encore un peu....
Marsh Posté le 28-04-2004 à 10:44:49
tu devrais te documenter sur perl ca t'aiderait probablement
Marsh Posté le 28-04-2004 à 13:16:02
Pourquoi tu fais un while ?
Fait plutôt une boucle :
for I in 1 2 3 4 5 6 7 8 9 10
do
...
done
Marsh Posté le 28-04-2004 à 13:16:46
Pour ton While, remplace
while [ "`eval "X\${ETH_${I}_${J}}"`" != "X" ]; do
par
while [ "`eval "echo X\${ETH_${I}_${J}}"`" != "X" ]; do
Marsh Posté le 28-04-2004 à 17:40:43
ok merci...
pour le for, c'est parce que je voulais ne pas avoir a imposer le nombre de groupes en fait.
je vais regarder ce que t'a fait pour le while, merci beaucoup, mais déjà, je viens d'alléger gravement le bidule:
Avant:
eval `echo "ETH_${I}_0"`=$`echo "${A}_ETH_${I}_0"`
Maintenant:
eval ETH_${I}_0="\$${A}_ETH_${I}_0"
en + c'est vachement plus compréhensible...
Marsh Posté le 29-04-2004 à 10:17:10
yes, de mieux en mieux:
Code :
|
Marsh Posté le 29-04-2004 à 11:29:01
je préfére la forme :
let I=$I+1
Mais c'est totalement personnel.
Marsh Posté le 29-04-2004 à 12:15:57
d'accord, moi je veux bien
je me servirais de let comme ca
bon, sinon, en fait ca marche pas dans le if... ni dans le while, même avec la syntaxe que tu proposais... domage
Marsh Posté le 29-04-2004 à 12:41:55
je crois que mes pb de tests -n et -z viennent de ksh, ca a l'air de marcher en bash... mais parcontre y'a des trucs qui ont l'air de changer au niveau des déclarations de variables...
Marsh Posté le 30-04-2004 à 13:05:19
en fait (si jamais ca interesse kkn...) j'ai trouvé (je pense) d'où viennent mes pb de tests qui ne marchent pas, c'est depuis que je travaille sur les machines en session SSH que les tests de valeurs nulles ne fonctionnene plus!!!
et pour les evals dans les if et dans les while, comme j'y arivais pas, bein je les ai déportés avant les tests, en utilisant une variable tout simplement...
en tt cas, now c'est bien cool, ca fait des scripts trés adaptatifs aux nombres de variables...
et aussi, si ca interesse, les grandes séries de / pour de gros morceaux de lignes non interprétées par le eval peuvent être mises entre '' ce qui augmente quand même la lisibiulité, genre: \>\> \${IFCFGPATH} --> '>> ${IFCFGPATH}'
bref, voilà
Marsh Posté le 27-04-2004 à 11:45:53
voilà, (toujours en ksh mais je veux bien faire du sh, du bash ou autre)
En fait voilà ce que je fais:
et moi j'aurais aimé faire sans case avec kkchose du genre:
HOSTNAME=${$1}
sauf que ca marche pas comme ca...
bon, en plus j'ai beaucoup de variables a traiter de cette facon, et avoir la solution a ca alégerait beaucoup mon script...
merci merci, a cui qui trouve!!