[RESOLU] Variable et boucle for ..

Variable et boucle for .. [RESOLU] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 16-10-2008 à 13:23:37    

Bonjour à tous,
Il y a quelque chose que je n'arrive pas à réaliser avec un shell script.Je m'explique.
Je passe comme arguments à une boucle for une série de variable d'environnements qui contiennent des chemins :  
 
[preappl11i@rexfraappt001 drp]$ echo $APPL_TOP
/preprod/preprodappl
[preappl11i@rexfraappt001 drp]$ echo $COMMON_TOP
/preprod/preprodcomn
[preappl11i@rexfraappt001 drp]$
 
J'aimerais, dans  la boucle for afficher le nom de la variable et le contenu.
Si je fais ça, le contenue de la variable s'affcihe
 
for REP in $APPL_TOP $COMMON_TOP  ; do
 
echo -e  " $REP  :      "
 
done
 
si je fais ça, le nom de la variable s'affiche :  
for REP in APPL_TOP COMMON_TOP  ; do
 
echo -e  "$REP :     "
 
done
 
La question est : comment réussir à afficher le nom et le contenu des variables dans la même boucle ?
Si quelqu'un à une idée ....


Message édité par Drix75 le 16-10-2008 à 17:15:32
Reply

Marsh Posté le 16-10-2008 à 13:23:37   

Reply

Marsh Posté le 16-10-2008 à 13:25:32    

Single quote et double quote.
Pas de quoi [:prodigy]


---------------
Décentralisons Internet-Bépo-Troll Bingo - "Pour adoucir le mélange, pressez trois quartiers d’orange !"
Reply

Marsh Posté le 16-10-2008 à 13:31:11    

Oui je m'en doutait un peu  mais je ne trouve pas la bonne "combinaison"  à utiliser !


Message édité par Drix75 le 16-10-2008 à 13:31:31
Reply

Marsh Posté le 16-10-2008 à 13:38:05    

PWET="Yooplaboom"
echo '$PWET' --> Affichage de $PWET
echo "$PWET" --> Affichage de Yooplaboom


---------------
Décentralisons Internet-Bépo-Troll Bingo - "Pour adoucir le mélange, pressez trois quartiers d’orange !"
Reply

Marsh Posté le 16-10-2008 à 14:44:08    

Merci, mais cela ne focntionne pas :
[preappl11i@rexfraappt001 drp]$ echo  $APPL_TOP $COMMON_TOP
/preprod/preprodappl /preprod/preprodcomn
[preappl11i@rexfraappt001 drp]$
[preappl11i@rexfraappt001 drp]$ for REP in $APPL_TOP $COMMON_TOP  ; do echo $REP '$REP' "$REP" ; done
/preprod/preprodappl $REP /preprod/preprodappl
/preprod/preprodcomn $REP /preprod/preprodcomn
[preappl11i@rexfraappt001 drp]$ for REP in APPL_TOP COMMON_TOP  ; do echo $REP '$REP' "$REP" ; done
APPL_TOP $REP APPL_TOP
COMMON_TOP $REP COMMON_TOP
[preappl11i@rexfraappt001 drp]$
 :(

Reply

Marsh Posté le 16-10-2008 à 14:46:57    

tu veux pas mettre des balise "code" ou "fixed" des fois, histoire que ça soit lisible ? [:toukc]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 16-10-2008 à 15:02:43    

Yep !   :D  
 
preappl11i@rexfraappt001 drp]$ echo  $APPL_TOP $COMMON_TOP

/preprod/preprodappl /preprod/preprodcomn


 
[preappl11i@rexfraappt001 drp]$
[preappl11i@rexfraappt001 drp]$
[preappl11i@rexfraappt001 drp]$ for REP in $APPL_TOP $COMMON_TOP  ; do echo $REP  '$REP'  "$REP" ; done

/preprod/preprodappl   $REP   /preprod/preprodappl


/preprod/preprodcomn   $REP   /preprod/preprodcomn


 
preappl11i@rexfraappt001 drp]$
preappl11i@rexfraappt001 drp]$
[preappl11i@rexfraappt001 drp]$ for REP in APPL_TOP COMMON_TOP  ; do echo $REP   '$REP'   "$REP" ; done

APPL_TOP   $REP   APPL_TOP


COMMON_TOP   $REP   COMMON_TOP


 
[preappl11i@rexfraappt001 drp]$
 
C'est mieux comme ça ? :)  

Reply

Marsh Posté le 16-10-2008 à 15:11:32    

oui :jap:

 

sinon pour répondre à ta question ... c'est pas possible :non:
à partir du moment ou tu écris

Code :
  1. for i in $toto $tata; do ...


tes variables $toto et $tata sont automatiquement traduites avant que la boucle ne soit lancée et que les valeurs soient affectées à $i :spamafote:


Message édité par wedgeant le 16-10-2008 à 15:11:45

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 16-10-2008 à 15:20:02    

OK merci pour lma réponse.
Et si je pars sur un truc comme ça :  
 

Code :
  1. for i in toto tata; do ...


 
Est ce possible d'afficher le contenu de $toto ou $tata ?

Reply

Marsh Posté le 16-10-2008 à 15:21:51    

Code :
  1. for i in toto tata; do
  2.    echo "$i" "${$i}"
  3. done
 

à essayer, sans garantie :sweat:


Message édité par wedgeant le 16-10-2008 à 15:22:19

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 16-10-2008 à 15:21:51   

Reply

Marsh Posté le 16-10-2008 à 15:29:54    

Déja testé , il aime pas du tout ... :  
line 19: ${$REP}: bad substitution  :sweat:  

Reply

Marsh Posté le 16-10-2008 à 15:30:50    

Déja testé , il aime pas du tout ... :  
line 19: ${$REP}: bad substitution  :sweat:  
Mais merci quand même  :)

Reply

Marsh Posté le 16-10-2008 à 15:31:29    

ben sinon y'a la méthode Conan [:prodigy]

Code :
  1. for i in toto tata; do
  2.     tmp = "$i"
  3.     echo "$i" "$tmp"
  4. done
 

[:wark0]

 

edit: quoi que, j'ai un doute en fait [:transparency]

 

edit²: ah sinon, voir avec les fonctions "env" ou "getenv" ... [:icon3]


Message édité par wedgeant le 16-10-2008 à 15:32:39

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 16-10-2008 à 15:35:36    

Bien sûr que si c'est possible, avec eval

Reply

Marsh Posté le 16-10-2008 à 15:37:35    

OK merci je vais regarder ça (eval et get env)
J'update le topic quand cela sera OK !

Reply

Marsh Posté le 16-10-2008 à 16:20:11    

Ben ... pas mieux !!
eval sert à évaluer une commande je ne vois pas trop à quoi cela va me servir

Reply

Marsh Posté le 16-10-2008 à 17:05:12    

Exemple :

#!/bin/sh
 
TOTO=abc
TITI=def
TATA=ghi
 
for i in TOTO TITI TATA
do
        eval "echo $i = \$$i"
done


Explication : la chaine qui suit le "eval" est evaluée par le shell, qui va remplacer les deux $i par leur valeur. Le eval va évaluer le résultat, c'est à dire par exemple pour la première boucle, la chaine "echo TOTO = $TOTO".

Reply

Marsh Posté le 16-10-2008 à 17:14:51    

Merci beaucoup !
Ca fonctionne ...
J'ai pas trop bien compris ce que fait concrètement eval, j'y reflechirais à tête reposé ...
Merci encore !


Message édité par Drix75 le 16-10-2008 à 17:20:44
Reply

Marsh Posté le 16-10-2008 à 17:25:50    

Il evalue l'expression formée par la concaténation de ce que tu lui passe en argument (ici on lui passe un seul argument, qui est une chaine).

Reply

Marsh Posté le 17-10-2008 à 15:42:45    

En plus clair  :D , eval force le shell à interpreter une chaine de caractère comme une commande :  

[preappl11i@rexfraappt001 drp]$ echo Bonjour à tous
Bonjour à tous
[preappl11i@rexfraappt001 drp]$ export  ma_variable="echo Bonjour à tous"
[preappl11i@rexfraappt001 drp]$
[preappl11i@rexfraappt001 drp]$ echo $ma_variable
echo Bonjour à tous
[preappl11i@rexfraappt001 drp]$ eval $ma_variable
Bonjour à tous
[preappl11i@rexfraappt001 drp]$

Reply

Marsh Posté le 06-11-2008 à 21:25:17    

Hop, ma contribution :)
 
 

Code :
  1. #!/bin/bash
  2. APPL_TOP=/preprod/preprodcomn
  3. COMMON_TOP=/prod/prodcomn
  4. for var in '$APPL_TOP' '$COMMON_TOP'; do
  5.     echo "La valeur est : $var"
  6.     echo -e "La variable est : $(eval echo $var)\n"
  7. done



Message édité par sputnick le 06-11-2008 à 21:26:02
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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