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 :

Affectation de variable automatique via un fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 42
    Par défaut Affectation de variable automatique via un fichier
    Bonjour tout le monde,

    Je n'ai pas réussi a expliquer simplement ce que je voulais dans le titre mais voilà mon problème idée:

    - Il y a un fichier dans lequel se trouvent des informations sous la forme variable:valeur.

    - Je récupère ce fichier, le parse, crée des variables avec les valeurs du fichier puis je travaillerai avec.

    Le problème: c'est qu'après des heures à me battre avec awk,sed, j'en suis arrivé à jouer avec eval et cut.

    le fichier variable qui contient les variables à traiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Client:NomDUCLIENT
    Ip:10.0.0.1
    Id:admin
    Password:Password-Firewall
    Tftp:10.0.0.2
    IdTftp:root
    PassTftp:Password2
    Le script qui travaillera avec ces variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #! /bin/bash
     
    cat ./test.xml | while read line 
    do
    	if [[ -z $line ]]
    		then 
    			echo "Empty line"
    	else 
    		eval$($(echo $line | cut -d: -f1)=$(echo $line | cut -d: -f2))
    	fi
    done
    La console retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Empty line
    ./utilisation_XML.sh: line 9: Client=NomDUCLIENT: command not found
    ./utilisation_XML.sh: line 9: Ip=10.0.0.1: command not found
    ./utilisation_XML.sh: line 9: Id=admin: command not found
    ./utilisation_XML.sh: line 9: Password=Password-Firewall: command not found
    ./utilisation_XML.sh: line 9: Tftp=10.0.0.2: command not found
    ./utilisation_XML.sh: line 9: IdTftp=root: command not found
    Je sais grâcce au peut d'expérience que j'ai que lorsqu'on commence à se battre avec eval il est temps de faire une pause ^_^

    Est-ce que vous sauriez m'aider pour que variable:valeur devienne et que un retourne ?

    Merki

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat testVar
    variable:valeur
    $ source <(sed 's/:/=/' testVar)
    $ echo "$variable"
    valeur
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 42
    Par défaut
    Merci pour ta réponse N_BaH.

    Je ne connaissais pas source mais ça a l'air pas mal

    Je ne comprenais pas pourquoi ce bout de script ne fonctionnait pas lors des tests mais il semble que tester un script bash sur un mac n'est pas forcément une bonne idée ^_^.

    Encore merci et à bientôt.

  4. #4
    Membre éprouvé Avatar de Levi59
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 58
    Par défaut
    Le problème de ton bout de script c'était que après conversion par eval de ton code, tu avais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $(Client=NomDUCLIENT)
    $(Ip=10.0.0.1)
    $(Id=admin)
    $(Password=Password-Firewall)
    $(Tftp=10.0.0.2)
    $(IdTftp=root)
    $(PassTftp=password2)
    Du coup, le shell ne comprenait pas ton intention et cherchait la commande Ip=10.0.0.1 par exemple.

    Autre chose si tu dois à nouveau utiliser cut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(echo $line | cut -d: -f1)

    peut être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(cut -d: -f1 <<<$line)
    Et également, les variables définies dans une pipe ne sont pas conservées à la fin de celle ci. Il vaut mieux utiliser des redirections si tu compte conserver des variables définies dans la boucle while . ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    akira@virtualcrunchbang:~$ cat ex
    ligne1
    ligne2
    ligne3
    akira@virtualcrunchbang:~$ cat ex | while read line;do ligne=$line; echo $ligne ;done; echo "***$ligne***"
    ligne1
    ligne2
    ligne3
    ******
    akira@virtualcrunchbang:~$ while read line;do ligne=$line; echo $ligne ;done <ex ; echo "***$ligne***"
    ligne1
    ligne2
    ligne3
    ***ligne3***

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 42
    Par défaut
    Merci Levi59,

    J'avais mis un peut de coté ce que je voulais faire avec ce morceau de script mais je ne vais pas tarder à m'y remettre

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par OlFo66 Voir le message
    Le script qui travaillera avec ces variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #! /bin/bash
     
    cat ./test.xml | while read line 
    do
    	if [[ -z $line ]]
    		then 
    			echo "Empty line"
    	else 
    		eval$($(echo $line | cut -d: -f1)=$(echo $line | cut -d: -f2))
    	fi
    done
    La console retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Empty line
    ./utilisation_XML.sh: line 9: Client=NomDUCLIENT: command not found
    ./utilisation_XML.sh: line 9: Ip=10.0.0.1: command not found
    ./utilisation_XML.sh: line 9: Id=admin: command not found
    ./utilisation_XML.sh: line 9: Password=Password-Firewall: command not found
    ./utilisation_XML.sh: line 9: Tftp=10.0.0.2: command not found
    ./utilisation_XML.sh: line 9: IdTftp=root: command not found
    Je sais grâce au peu d'expérience que j'ai que lorsqu'on commence à se battre avec eval il est temps de faire une pause ^_^

    Est-ce que vous sauriez m'aider pour que variable:valeur devienne variable=valeur et que un echo $variable retourne valeur ?

    Merki
    àmha, il suffit de retirer un niveau d'évaluation, c'est-à-dire un '$(' et un ')':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #! /bin/bash
     
    cat ./test.xml | while read line 
    do
    	if [[ -z $line ]]
    	then 
    		echo "Empty line"
    	else 
    		eval $(echo $line | cut -d: -f1)=$(echo $line | cut -d: -f2)
    	fi
    done
    Remarque: si une ligne contient plusieurs signes ":", ça ne marchera pas car le cut -d: -f2 ne prendra que la partie du milieu, entre les deux premiers ":"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Password:ceci:est:mon:mot:de:passe
    Remarque: si une ligne contient une espace " ", ça ne marchera pas car le eval "A=B C" provoquera une erreur. Il faudrait ajouter un "\" devant chaque espace.

    HTH
    )jack(

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

Discussions similaires

  1. [AJAX] Rafraichir automatiquement des variables cgi dans un fichier htm
    Par lcoulon dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/10/2008, 16h43
  2. acceder à une variable via un fichier properties
    Par Mobistar dans le forum Entrée/Sortie
    Réponses: 21
    Dernier message: 07/08/2008, 10h20
  3. Réponses: 2
    Dernier message: 28/05/2008, 17h35
  4. Réponses: 6
    Dernier message: 08/01/2008, 12h48
  5. Réponses: 7
    Dernier message: 30/05/2006, 14h08

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