récupérer et réutiliser les paramètres dans un for

récupérer et réutiliser les paramètres dans un for - Shell/Batch - Programmation

Marsh Posté le 18-04-2006 à 14:22:49    

Bonjour,
 
Je souhaite récupérer en paramètres les variables dans un SHELL script. ce sont en fait des adresses IP.
Comme je ne connais pas le nombre exacte, j'effectue une boucle for pour toutes les récupérer.
 
J'arrive à récupérer les différentes IP :
 
for (( i=1 ; i<= $# ; i++ )) ; do
 eval IP$i=\$$i
done
 
Déjà je sais pas s'il existe une manière plus élégante d'affecter la variable.. j'ai trouvé ca par hasard.
Si je fais "echo $IP1" cela m'affiche correctement ma première adresse IP passée en paramètre.
 
Mais, je souhaite pouvoir réutiliser ses variables dans une autre boucle for :
 
for (( i=1 ; i<= $# ; i++ )) ; do
 echo $IP\$$i                         #marche pas
done
 
Et je n'arrive pas à trouver...
Merci


Message édité par erlend le 18-04-2006 à 14:39:33
Reply

Marsh Posté le 18-04-2006 à 14:22:49   

Reply

Marsh Posté le 19-04-2006 à 01:05:33    

#!/bin/bash
 
for (( i=1 ; i<= $# ; i++ )) ; do  
 eval IP$i=\$$i  
done  
 
for (( i=1 ; i<= $# ; i++ )) ; do  
 eval echo $IP\$$i                          
done  
 
# tout seul sans eval "echo $IP\$$i"  signifie que tu
#imprimes la variable d env IP (qui vaut nulle)
# car ce sont les variables d environnment IP1, IP2 que tu as défines
#dans ta 1ere boucle
#puis le carcatère '$'
# puis la varaibale i (qui est une compteur sur le nombre de params
# passes)
#  

Reply

Marsh Posté le 19-04-2006 à 11:26:18    

Je suis d'accord avec toi.
J'ai oublié de précisé une chose, excuse moi, je n'y avait plus repensé
 
il me semble que j'avais réussi à faire ce que tu viens de mettre,
mais maintenant après le echo, je souhaite compte le nombre de caractère avec wc et stocker la valeur qui est calculée
 
#!/bin/bash
 
for (( i=1 ; i<= $# ; i++ )) ; do  
 eval IP$i=\$$i  
done  
 
for (( i=1 ; i<= $# ; i++ )) ; do  
 eval echo $IP\$$i | wc -m
done  
 
Avec ceci, ca m'affiche le nombre de caractère (- 1) de mon adresse IP.
 
ET mon problème est que je ne vois pas comment faire pour stocker ce chiffre.
 
qd j'essaye de faire une affectation la plupart du temps il n'évalue plus mon expression et je me retrouve avec un 0.
j'ai vu qu'on pouvait faire des eval d'eval mais je ne m'en suis pas sorti
 
merci de ton aide

Reply

Marsh Posté le 19-04-2006 à 13:20:09    

erlend a écrit :

mais maintenant après le echo, je souhaite compte le nombre de caractère avec wc et stocker la valeur qui est calculée


 
Fait attention, " wc" compte tous les caractères affichés. C'est à dire que si tu fais "echo a |wc -c", tu auras "2" et non "1" (le "a" et le retour charriot)
 
Utilises donc "expr valeur : '.*'" pour récupérer le nb de caractères...

var=`eval echo \$IP$i`
nb=`expr $var : '.*'`


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-04-2006 à 22:18:06    

erlend a écrit :

Je suis d'accord avec toi.
J'ai oublié de précisé une chose, excuse moi, je n'y avait plus repensé
 
il me semble que j'avais réussi à faire ce que tu viens de mettre,
mais maintenant après le echo, je souhaite compte le nombre de caractère avec wc et stocker la valeur qui est calculée
 

Code :
  1. #!/bin/bash
  2. for (( i=1 ; i<= $# ; i++ )) ; do 
  3. eval IP$i=\$$i 
  4. done 
  5. for (( i=1 ; i<= $# ; i++ )) ; do 
  6. eval echo $IP\$$i | wc -m
  7. done


Avec ceci, ca m'affiche le nombre de caractère (- 1) de mon adresse IP.
 
ET mon problème est que je ne vois pas comment faire pour stocker ce chiffre.
 
qd j'essaye de faire une affectation la plupart du temps il n'évalue plus mon expression et je me retrouve avec un 0.
j'ai vu qu'on pouvait faire des eval d'eval mais je ne m'en suis pas sorti
 
merci de ton aide


 
 
Dans ce cas :
 

Code :
  1. #!/bin/bash
  2. for (( i=1 ; i<= $# ; i++ )) ; do
  3. eval IP$i=\$$i
  4. echo "direct" $i
  5. echo "indirect" \$$i
  6. echo $IP
  7. echo $IP1
  8. done
  9. echo "---------------------"
  10. for (( i=1 ; i<= $# ; i++ )) ; do
  11. eval x=$IP\$$i
  12. echo @IP: ${x} Longueur ${#x}
  13. done


Reply

Marsh Posté le 09-05-2006 à 14:37:53    

merci  
ca à l'air de fonctionner
par contre fais attention skyofdiamonds !
en utilisant les balises 'codes' tu perds les anti-slash
 
Code :
 
for (( i=1 ; i<= $# ; i++ )) ; do
 eval x=$IP\$$i
 echo @IP: ${x} Longueur ${#x}
done
 
je vais travaillé sur ca merci
 
pourrais tu me donner l'origine de ${x} et de ${#x} ??
je peux les utiliser comment ?

Message cité 1 fois
Message édité par erlend le 09-05-2006 à 14:39:19
Reply

Marsh Posté le 09-05-2006 à 23:01:40    

erlend a écrit :

pourrais tu me donner l'origine de ${x} et de ${#x} ??
je peux les utiliser comment ?


 
${x} sert à isoler le nom de la variable de son environnement chaque fois qu'il peut y avoir ambiguité
ex:
prix=10
echo $prixF   => le shell croit que tu parles de la variable "prixF" alors que tu veux "prix" suivi de "F" => echo ${prix}F
 
${#x} est une extension bash et ne fait donc pas partie du Bourne Shell. Elle signifie "longueur de la chaîne contenue dans x".
ex: lg=${#x}
 
Si t'as que le Bourne Shell à ta disposition, tu peux passer par "expr" pour obtenir le même résultat
ex: lg=`expr $x : '.*'`


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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