IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Evaluation variable d'environnement


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Par défaut Evaluation variable d'environnement
    Bonjour,

    je lis une variable d'environnement dans un fichier et quand je l'utilise dans un shell, elle n'est pas évaluée.

    Voici mon bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/sh
    echo " --> ma venv=${MA_VAR}
    mon_fic=`cat /home/sp/mon_fichier.txt | grep "^FIC" `
    chemin=`echo $mon_fic | cut -d ";" -f2`
    fic=`echo $mon_fic | cut -d ";" -f3`
    ls $chemin/$fic
    contenu de mon_fichier.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FIC;/home/sp/${MA_VAR}/rep1/rep2;fichier.txt
    l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    export MA_VAR="mon_rep"
    ./mon_code.sh
    --> ma venv=mon_rep
    ls: cannot access /home/sp/${MA_VAR}/rep1/rep2/fichier.txt
    Je ne comprend pas pourquoi la venv MA_VAR n'est pas remplacée lors du "ls"

    Merci de vos réponses

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    D'abord, tu peux simplifier pour extraire et mettre en forme ta valeur en une seule commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chemin=$(sed -ne '/^FIC/ s§^.*\;\(.*\)\;\(.*\)§\1/\2/§p' /home/sp/mon_fichier.txt)
    (Je réutilise tes noms de variables, mais elles n'ont plus la même signification)

    A ce niveau là, ta variable n'est toujours pas convertie.
    Pour qu'elle le soit, il faudrait l'afficher.
    Le plus simple, ce serait cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fic=$(eval "echo ${chemin}")
    On pourrait même tout ramener en une seule ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fic=$(eval "echo $(sed -ne '/^FIC/ s!^.*\;\(.*\)\;\(.*\)!\1/\2/!p' /home/sp/mon_fichier.txt)"
    Mais il y a surement des spécialistes du shell sur ce forum pour proposer une meilleure solution.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Par défaut
    Merci.
    En ajoutant un eval cela fonctionne.
    J’aimerai comprendre pourquoi la variable d'environnement n'est pas évaluée alors que si je fait un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      toto="/home/sp/${MA_VAR}/toto"
      echo $toto
    --> là j'ai bien MA_VAR qui est remplacé par sa valeur.
    Alors pourquoi ma variable qui contient en fait la même chose mais en lisant un fichier, n'est pas évaluée ???

    Merci aussi pour les simplifications .....

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par spe31500 Voir le message
    Alors pourquoi ma variable qui contient en fait la même chose mais en lisant un fichier, n'est pas évaluée ???
    Parce qu'elle est évaluée au moment où tu valides la première ligne dans le terminal.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Par défaut
    Désolée ... Comprends pas ....

    dans le même shell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/bin/sh
    echo " --> ma venv=${MA_VAR}"                            --> variable évaluée
     
    mon_fic=`cat /home/sp/mon_fichier.txt | grep "^FIC" `
    chemin=`echo $mon_fic | cut -d ";" -f2`
    fic=`echo $mon_fic | cut -d ";" -f3`
    ls $chemin/$fic                                                    --> variable NON évaluée
     
    toto="/home/sp/${MA_VAR}/rep1/rep2"
    echo $toto                                                         --> variable évaluée
    Dans le terminal je tape :
    export MA_VAR="mon_rep"
    ./mon_code.sh

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Ce que fait ton script est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      toto='/home/sp/${MA_VAR}/toto'
      echo $toto
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par spe31500 Voir le message
    Je ne comprend pas pourquoi la venv MA_VAR n'est pas remplacée lors du "ls"
    Bonjour
    Parce que dans le contexte, ce n'est pas une variable écrite dans ton shell mais une chaine de caractères lue depuis un fichier texte.

    T'as deux façons de faire

    1) tu écris ton fichier comme si c'était un shell
    exemple de fichier "mon_fichier.txt"
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    fic=/home/sp/${MA_VAR}/rep1/rep2

    Puis tu "sources" ton fichier depuis ton autre script
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    source "mon_fichier.txt"
    ls "$fic"

    2) tu utilises "eval" qui permet de transformer une chaine en instruction shell
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
    echo " --> ma venv=${MA_VAR}
    mon_fic=`cat /home/sp/mon_fichier.txt | grep "^FIC" `
    chemin=`echo $mon_fic | cut -d ";" -f2`
    fic=`echo $mon_fic | cut -d ";" -f3`
    eval "ls $chemin/$fic"

    Et évite les chaines à la con style "/home/sp". Déjà t'as "$HOME" et "$LOGNAME" assez pratiques mais en plus, quand on connait la façon dont Unix cherche les path qu'on lui donne, on peut s'éviter de travailler en absolu (d'ailleurs les path en absolu ne sont pas toujours de bonnes idées surtout quand on développe un truc qu'on doit ensuite installer ailleurs...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [langage] Création de variable d'environnements
    Par Smaugg dans le forum Langage
    Réponses: 20
    Dernier message: 26/04/2004, 09h32
  2. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31
  3. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 15h21
  4. Réponses: 4
    Dernier message: 18/07/2002, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo