Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1420 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  nom de variable dans un nom de variable

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

nom de variable dans un nom de variable

n°2152058
Misssardon​ik
prévisible a posteriori
Posté le 01-08-2012 à 18:59:49  profilanswer
 

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
mood
Publicité
Posté le 01-08-2012 à 18:59:49  profilanswer
 

n°2152069
@Lice
Posté le 01-08-2012 à 20:38:15  profilanswer
 

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
 

n°2152075
Misssardon​ik
prévisible a posteriori
Posté le 01-08-2012 à 21:13:31  profilanswer
 

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
n°2152094
Profil sup​primé
Posté le 02-08-2012 à 03:06:21  answer
 

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
n°2152484
Misssardon​ik
prévisible a posteriori
Posté le 03-08-2012 à 17:37:52  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  nom de variable dans un nom de variable

 

Sujets relatifs
problème d'utilisation de variable shell dans un scriptVariable Tableau qui ne passe pas en condition ( ! )
Tableaux de dimension variableAjout de zero a une variable
[Résolu] Passer une variable dans un include[vbs] nom de variable dynamique
Chemin de fichier en variableAppel fonction Javascript dans variable PHP
TCD à plage variablePage de taille variable pour un portfolio wordpress
Plus de sujets relatifs à : nom de variable dans un nom de variable


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR