[script/bash] Variable d'environnement

Résolu
panicc Messages postés 4 Statut Membre -  
asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   -
Bonjour,

J'écris un script qui appelle une variable d'environnement:
tail $[$fichier]

la variable $fichier etant definie dans le script.

il reconnait la variable mais refuse d'executer la commande tail. Le message d'erreur est du style:
./script: line 71: /Users/nobody/Documents/fichier.txt: syntax error: operand expected (error token is "/Users/nobody/Documents/fichier.txt")

je ne sais pas quoi faire...

panicc

4 réponses

  1. jisisv Messages postés 3678 Statut Modérateur 936
     
    Je ne sais pas ce que tu veux faire.
    L'entité
    $[$fichier] est une expression arithmétique (évalua tion du contenu de la variable fichier)
    exemple
    johand@horus:~$ fichier=packages-2005-05-10
    johand@horus:~$ echo $[$fichier]
    -2020
    johand@horus:~$ fichier=packages-2005-05-10.txt
    johand@horus:~$ echo $[$fichier]
    bash: packages-2005-05-10.txt: syntax error in expression (error token is ".txt")
    

    Extrait de man bash
    Arithmetic  expansion allows the evaluation of an arithmetic expression and the substitution of the result.  The format for  arithmetic  expansion is:
    
                  $((expression))
    
           The  old  format  $[expression]  is  deprecated  and will be removed in  upcoming versions of bash.
    

    Essaye de préciser le but de ta manip...
    Johan
    0
    1. panicc Messages postés 4 Statut Membre
       
      Merci pour ta réponse.

      Donc le but de ma manip:
      j'ai 10 fichiers (dont les chemins sont définis comme variables d'environnements-> car ça change parfois).
      Je souhaite faire un petit script qui utilise ces fichiers, mais le script ne traite pas toujours les 10 fichiers à la fois. Donc le nom de la variable d'environnement qui accède au fichier à traiter je la stocke dans la variable $fichier.

      a+

      panicc
      0
      1. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426 > panicc Messages postés 4 Statut Membre
         
        D'ou l'importance du nom des variable alors :)

        j'aurais nomme ta variable $fichier -> $var_fichier
        mettons que $fichier contient "/home/toi/ton_fichier"
        $var_fichier contient "fichier"

        en gros, tu voudrais que
        cat $var_fichier <=> cat $fichier <=> cat /home/toi/ton_fichier

        C'est bien ça ?
        Dans ce cas, je ne connais pas cette possibilitée dans bash, mais on ne sais jamais, je cherchais a faire la même chose a peu prés en php, et j'ai fini par tomber dessus

        En attendant tu peux toujour te créer un fichier temporaire
        mettons que tes variable d'environnement soient:
        fichier=/mon_fichier
        var_fichier=fichier


        Ton script pourrait commencer par:

        cat >tmp<<EOF
        a=\$$var_fichier
        EOF
        source tmp && rm tmp

        cat $a #doit afficher $fichier

        A tester :)
        0
      2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > panicc Messages postés 4 Statut Membre
         
        Salut,

        Je suis pas sur d'avoir tout pigé là :-/
        mais j'ai ça en stock, en espèrant que ça puisse servir :
        [jp@Mandrake tmpfs]$ my_var=var
        
        [jp@Mandrake tmpfs]$ echo $my_var
        var
        
        [jp@Mandrake tmpfs]$ echo `echo  \\$"$my_var"`
        $var
        
        [jp@Mandrake tmpfs]$
        ;-))
        0
      3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > panicc Messages postés 4 Statut Membre
         
        Bon laissez tomber ce que j'ai dit au-dessus, je m'étais totalement "gourgé" ;-(
        Enfin, non disons que j'avais mal interprétationné la "chose" :-DDD

        Donc revenons à nos moutons et il semblerait qu'avec la commande "eval" (commande interne du "bash"), ça le fasse :
        [jp@Mandrake tmpfs]$ monfich=/home/jp/tmpfs/fich.txt
        
        [jp@Mandrake tmpfs]$ cat fich.txt
        Ceci est un exemple d'affichage avec un remplacement de variable.
        Pour ce faire nous utilisons la commande interne du bash "eval".
        
        [jp@Mandrake tmpfs]$ echo $monfich
        /home/jp/tmpfs/fich.txt
        
        [jp@Mandrake tmpfs]$ var_monfich='$monfich'
        
        [jp@Mandrake tmpfs]$ echo $var_monfich
        $monfich
        
        [jp@Mandrake tmpfs]$ cat $var_monfich
        cat: $monfich: No such file or directory
        
        [jp@Mandrake tmpfs]$ eval cat $var_monfich
        Ceci est un exemple d'affichage avec un remplacement de variable.
        Pour ce faire nous utilisons la commande interne du bash "eval".
        
        [jp@Mandrake tmpfs]$
        Enjoy (comme dirait l'ami "johndoe") ;-))
        0
      4. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Arf, Bien joué :)

        Je croyait pourtant avoir trituré eval dans tout les sens hier, mais j'ai du louper un test :)
        0
  2. Timon1102 Messages postés 354 Statut Membre 109
     
    il ne faut pas des espaces autours des crochets ?
    0
  3. panicc Messages postés 4 Statut Membre
     
    J'ai donc essayé les 2 propositions:

    > echo $[ $fichier]
    c'est idem que $[$fichier]

    > echo $fichier
    s'affiche le nom de la variable d'environment sans le $. Donc bien sûr ce n'est pas le contenu du fichier qui s'affiche...

    Si j'ai bien compris ta réponse Johan: je ne peux pas stocker le nom d'une variable d'environnement dans une variable telle que $fichier? ??
    Mais alors comment faire?
    0
  4. panicc Messages postés 4 Statut Membre
     
    Salut à tous et notamment à jipicy!

    Merci jipicy! ça marche! Je n'y croyais plus!!!!

    Donc voici le récapitulatif de la solution:
    (Ecrit par jipicy)

    ----------
    il semblerait qu'avec la commande "eval" (commande interne du "bash"), ça le fasse :

    [jp@Mandrake tmpfs]$ monfich=/home/jp/tmpfs/fich.txt

    [jp@Mandrake tmpfs]$ cat fich.txt
    Ceci est un exemple d'affichage avec un remplacement de variable.
    Pour ce faire nous utilisons la commande interne du bash "eval".

    [jp@Mandrake tmpfs]$ echo $monfich
    /home/jp/tmpfs/fich.txt

    [jp@Mandrake tmpfs]$ var_monfich='$monfich'

    [jp@Mandrake tmpfs]$ echo $var_monfich
    $monfich

    [jp@Mandrake tmpfs]$ cat $var_monfich
    cat: $monfich: No such file or directory

    [jp@Mandrake tmpfs]$ eval cat $var_monfich
    Ceci est un exemple d'affichage avec un remplacement de variable.
    Pour ce faire nous utilisons la commande interne du bash "eval".
    ---------

    CA MARCHE!!!

    a+ :D
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Happy for you ;-))
      0