[bash] Probleme de variables dans un fichier

Résolu
Bonjour,

Voici mon probleme :

j'ai un fichier test.var qui contient la ligne suivante :
-v var_1=$valeur_1 -v var_2=$valeur_2

j'ai un script qui doit lire le fichier et mettre dans une variable le contenu de la ligne en valorisant les variables $valeur_1 et $valeur_2

exemple :

valeur_1=10
valeur_2=20

chaine=`cat test.var`
echo $chaine


ici $chaine devrait contenir :

-v var_1=10 -v var_2=20


mais ce n'est pas le cas, et je ne connais pas la méthode pour y arriver.

Merci de votre aide

Bonne journée

Tanith
Configuration: Windows XP
Internet Explorer 6.0

3 réponses

  1. Modérateur
    Le shell en général procède à l'interprétation des caractères spéciaux de la ligne de commande .
    Dans le cas de remplacement de variable, il ne procède pas à une nouvelle interprétation de la ligne générée (quoique avec les nouvelles versions c'est pas tout à fait vrai), et de ce fait les caractères spéciaux ne sont pas interprétés.
    C'est pour quoi il faut donc faire interpréter la commande par "eval".

    Petit exemple :
    [tmpfs]$ A=B;B=C     # Déclaration des variables
    
    [tmpfs]$ D=$A     # En affectant la valeur de $A à D on espère obtenir la valeur de $B en fait
    
    [tmpfs]$ echo $D     # On essaie d'afficher la variable ainsi affectée
    
    B               # Ben non ! C'est la valeur de $A qui s'affiche
    
    [tmpfs]$ eval "D=\"\$$A\""     # En forçant l'évaluation, le shell évalue la chaîne $A et effectue le remplacement
    
    [tmpfs]$ echo $D     # On essaie d'afficher la variable ainsi affectée
    
    C     # Bingo ;-))
    
    [tmpfs]$
    En mode débogage c'est encore plus parlant :
    [tmpfs]$ set -x
    
    [tmpfs]$ A=B;B=C
    
    + A=B
    + B=C
    
    [tmpfs]$ D=$A
    
    + D=B
    
    [tmpfs]$ echo $D
    
    + echo B
    B
    
    [tmpfs]$ eval "D=\"\$$A\""
    
    + eval 'D="$B"'
    ++ D=C
    
    [tmpfs]$ echo $D
    
    + echo C
    C
    
    [tmpfs]$  
    ;-))
    1
    1. Contributeur
      Hi
      mettre des backslashes devant les $ pour q'ils ne soient pas interprétés lors du cat
      -v var_1=\$valeur_1 -v var_2=\$valeur_2
      0
      1. Merci pour ta réponse,

        mais aprés le cat du fichier je voudrais bien que la variable soit évaluée et remplacée par sa valeur prédéfinie dans le script ...

        merci encore

        Tanith
        0
      2. Contributeur
        Avec quel shell ?

        export valeur_1 valeur_2

        alors la substitution devrait jouer
        0
    2. Modérateur
      Salut,
      #! /bin/bash
      
      valeur_1=10
      valeur_2=20
      
      eval "chaine=\"$(cat test.var)\""
      echo "$chaine"
      Ce qui donne :
      [tmpfs]$ cat test.var
      
      -v var_1=$valeur_1 -v var_2=$valeur_2
      
      [tmpfs]$ ./foo.sh
      
      -v var_1=10 -v var_2=20
      
      [tmpfs]$
      :-))
      0
      1. Merci beaucoup jipicy,

        Ca marche super bien !!!

        Pour des fins d'éducation pourrais-tu prendre le temps d'expliquer en détails la ligne magique ?

        eval "chaine=\"$(cat test.var)\""


        Parce que ca marche bien mais je ne comprends pas vraiment pourquoi :-)

        Encore un gros merci

        Bonne journée

        Tanith
        0

    Discussions similaires

    question pix mot caché

    7 réponses