nom de variable dans un nom de variable

nom de variable dans un nom de variable - Shell/Batch - Programmation

Marsh Posté le 01-08-2012 à 18:59:49    

Bonjour, je cherche à faire (en bash) des variables avec un nom dynamique (nom généré à partir d'une autre variable).
 
Exemple :
 

Code :
  1. #!/bin/bash
  2. index=1
  3. cell_$index=3


 
résultat :  
 

Citation :

bash: cell_1=3 : commande introuvable


 
alors que je m'attendais à ce qu'il crée bêtement une variable cell_1 et lui attribue la valeur 3. D'ailleurs si je fais directement :
 

Code :
  1. #!/bin/bash
  2. cell_1=3
  3. echo $cell_1


 
il m'affiche bien 3. Alors quelle différence bash fait-il entre les deux et comment faire ? merci.


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
Reply

Marsh Posté le 01-08-2012 à 18:59:49   

Reply

Marsh Posté le 01-08-2012 à 20:38:15    

Je pense que cela pourrait t'aider :
 
var=val -->  affectation de la variable "var"
$var ou ${var} -->  contenu de la variable "var"
 
Exemple :
 
 
#!/bin/sh
 
VAR="variable"
variable=toto
 
echo $VAR    # => variable  
echo ${!VAR} # => toto
 

Reply

Marsh Posté le 01-08-2012 à 21:13:31    

salut,
 
oui j'avais déjà lu ce genre de chose mais je ne comprends pas comment je pourrais l'utiliser pour mon problème qui me semble un peu différent de ton exemple.
 
Entretemps, on m'a soufflé la solution suivante :
 

Code :
  1. #!/bin/bash
  2. index=1
  3. eval cell_$index=3


 
mais pour moi c'est complètement cryptique malheureusement, je ne comprends pas vraiment ce que fait le eval.


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
Reply

Marsh Posté le 02-08-2012 à 03:06:21    

salut,
 
oulala, non, n'utilise pas eval (c'est une bombe à retardement : un jour ça pourrait évaluer un rm -rf; donc, vaut mieux éviter)
bash met à notre disposition des tableaux

Code :
  1. #!/bin/bash
  2. index=1
  3. cel[$index]=3

à quoi ça doit servir ?
si index n'est pas forcément un nombre, bash a aussi des tableaux associatifs.


Message édité par Profil supprimé le 02-08-2012 à 03:08:17
Reply

Marsh Posté le 03-08-2012 à 17:37:52    

salut,

 

en fait c'est un petit script qui va chercher des valeurs en SNMP en boucle et fait un calcul :

 
Code :
  1. #!/bin/bash
  2. hostname='mon_host'       # nom de l'hôte a controller
  3. ip=78.96.8.86                   # ip de l'hôte à controller
  4. intervalle=10                   # intervalle de polling (en secondes)
  5. indexes=( 1 4 13 14 )           # indexes dans la table SNMP des disques / partitions à surveiller
  6. while true
  7. do
  8. for index in ${indexes[@]}
  9. do # pour chaque disque ou partition surveillée
  10. # on récupère les  valeurs de l'itération précédente
  11. eval writes_old_$index=`cat /tmp/writes_${index}_${hostname}`
  12. eval reads_old_$index=`cat /tmp/reads_${index}_${hostname}`
  13. # on récupère les nouvelles valeurs
  14. eval writes_$index=`snmpwalk -v 2c -c public -Ov $ip 1.3.6.1.4.1.2021.13.15.1.1.6.$index 2> /dev/null | sed 's/Counter32: //'`
  15. eval reads_$index=`snmpwalk -v 2c -c public -Ov $ip 1.3.6.1.4.1.2021.13.15.1.1.5.$index 2> /dev/null | sed 's/Counter32: //'`
  16. # on met à jour le fichier avec ces nouvelles valeurs (pour utilisation à l'itération suivante)
  17. eval echo -n \$writes_$index > /tmp/writes_${index}_${hostname}
  18. eval echo -n \$reads_$index > /tmp/reads_${index}_${hostname}
  19. # on calcule le différentiel entre les nouvelles valeurs et celles  de l'itération précédente
  20. eval let writes_diff_$index=\$writes_$index-\$writes_old_$index
  21. eval let reads_diff_$index=\$reads_$index-\$reads_old_$index
  22. # on calcule le taux d'opérations par seconde
  23. eval let writes_rate_$index=\$writes_diff_$index/$intervalle
  24. eval let reads_rate_$index=\$reads_diff_$index/$intervalle
  25. # affichage du résultat
  26. eval echo écritures/s disque \$index : \$writes_rate_$index
  27. eval echo lectures/s disque  \$index : \$reads_rate_$index
  28. done
  29. echo '' # saut de ligne
  30. sleep $intervalle # on attend avant de relancer une itération
  31. done
 

cette version avec eval fonctionne (j'ai maintenant compris comment ça marche), je vais voir ce que je peux faire en remplaçant par des tableaux.


Message édité par Misssardonik le 03-08-2012 à 17:41:04

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
Reply

Sujets relatifs:

Leave a Replay

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