encore un pb de script shell....

encore un pb de script shell.... - Codes et scripts - Linux et OS Alternatifs

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:
 

Code :
  1. master="serveur_toto"
  2. slave="serveur_tutu"
  3. case $1 in
  4.         master) HOSTNAME=$master
  5.         slave) HOSTNAME=$slave


 
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!! :)

Reply

Marsh Posté le 27-04-2004 à 11:45:53   

Reply

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.

Reply

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!!

Reply

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...)
 

Reply

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"
 

Reply

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... ?!?!?!

Reply

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}"
 
???

Reply

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 '``' ...


Message édité par yannigperr le 28-04-2004 à 08:55:34
Reply

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... :)

Reply

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... :)

Reply

Marsh Posté le 28-04-2004 à 09:46:32   

Reply

Marsh Posté le 28-04-2004 à 09:58:04    

Bon, je crois que je vais laisser tomber...
 
domage car là:
 

Code :
  1. I=1
  2. J=0
  3. while [ "`eval "X\${ETH_${I}_${J}}"`" != "X" ]; do
  4.         eval `echo "ETH_${I}_${J}"`=$`echo "${A}_ETH_${I}_${J}"`
  5.         eval echo "ETH_${I}_${J}=\$ETH_${I}_${J}"
  6.         (( I=I+1 ))
  7.         if [ I -ge 10 ]; then
  8.                 exit 3
  9.         fi
  10. done


 
je pense que je suis vraiment pas loin... le eval marche, le echo aussi, juste la condition du while qui merdoie encore un peu....

Reply

Marsh Posté le 28-04-2004 à 10:44:49    

tu devrais te documenter sur perl :D ca t'aiderait probablement ;)

Reply

Marsh Posté le 28-04-2004 à 12:06:00    

oui, je pense en effet que ca serait une bonne chose...

Reply

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

Reply

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

Reply

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...

Reply

Marsh Posté le 29-04-2004 à 10:17:10    

yes, de mieux en mieux:
 

Code :
  1. I=1
  2.         while [ I -le $NB_BONDS ]; do
  3.                 eval echo "DEVICE=\$VETH_${I}" \> \${IFCFGPATH}\${VETH_${I}}
  4.                 eval echo "ONBOOT=yes" \>\> \${IFCFGPATH}\${VETH_${I}}
  5.                 eval echo "IPADDR=\$IP${I}" \>\> \${IFCFGPATH}\${VETH_${I}}
  6.                 eval echo "NETMASK=\$MASK${I}" \>\> \${IFCFGPATH}\${VETH_${I}}
  7.                 if [ `eval "X\${GATEWAY${I}}"` != "X" ]; then
  8.                         eval echo "GATEWAY=\$GATEWAY${I}" \>\> \${IFCFGPATH}\${VETH_${I}}
  9.                 fi
  10.                 (( I=I+1 ))
  11.         done

Reply

Marsh Posté le 29-04-2004 à 11:29:01    

je préfére la forme :
let I=$I+1
 
Mais c'est totalement personnel.

Reply

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

Reply

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...

Reply

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à

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed