Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/08/2011, à 18:06

rraaffii

Mettre en variable un fichier configuration

Salut à tous !

J'ai fait un petit script pour charger en variable un fichier de configuration.
Car en root la commande "source" ne fonctionne pas j'ai dut trouver une alternative...

Votre fichier de configuration doit ressemblé à cela :

mot1 mot2
mot1 mot2
mot1 mot2
mot1 mot2
mot1 mot2

"mot1" est évidement le nom du paramétré de configuration et "mot2" le paramètre.

Maintenant le script (ici le fichier config serra /etc/mon_programme/config) :

#/bin/bash
fichier="/etc/mon_programme/config"
tmp_date=$(date +"%m%d%H%M%S");
while read line; do
        var=$(echo $line | cut -f 1 -d" ")
        cat $fichier | grep $var | cut -f 2 -d" " > /tmp/config-load.${tmp_date}.tmp;
        read $(echo $var) < /tmp/config-load.${tmp_date}.tmp;
done < $fichier;
unset var line fichier;
rm /tmp/config-load.${tmp_date}.tmp;

Ensuite c'est simple, "mot1" du fichier de configuration est le nom de la variable et mot2 le contenue de cette variable.

Voilà un exemple (totalement inventé et débile) :
Mon fichier de configuration est /etc/mysql_connect/mysql.info :

mysql_ip 127.0.0.1
mysql_port 3306
mysq_user trolle
mysql_password trololol
mysql_database emploie-du-temps
mysql_table trolle

Maintenant le script :

#/bin/bash
fichier="/etc/mysql_connect/mysql.info"
tmp_date=$(date +"%m%d%H%M%S");
while read line; do
        var=$(echo $line | cut -f 1 -d" ")
        cat $fichier | grep $var | cut -f 2 -d" " > /tmp/config-load.${tmp_date}.tmp;
        read $(echo $var) < /tmp/config-load.${tmp_date}.tmp;
done < $fichier;
unset var line fichier;
rm /tmp/config-load.${tmp_date}.tmp;
#Les paramètres sont maintenant en variable
query=$(mysql --host="${mysql_ip}" --port="${mysql_port}" --user="${mysql_user}" --password="${mysql_password}" --execute="USE ${mysql_database}; SELECT tache-a-faire FROM ${mysql_table} ORDER BY date DESC");
echo $query

C'est un exemple très débile je le reconnais^^

Ne pas utiliser de - pour le nom des paramètre sinon vous allez avoir une erreur comme celle-ci :

read: 6: server-ip: bad variable name

Et ne peut utiliser d'espace pour le nom du paramètre et le paramètre.


Pour une personne qui ne connais pas grand chose au shell ce script peut lui être très utile. Et pour ce qui on la flemme dans faire un il le serra aussi !

Si vous avez des questions je suis là smile

Dernière modification par rraaffii (Le 04/08/2011, à 18:24)

Hors ligne

#2 Le 04/08/2011, à 18:18

rraaffii

Re : Mettre en variable un fichier configuration

J'ai oublié de signaler dans qu'elle cas ce script pouvez être très utile.
Quand vous avez plusieurs scripts utilisant les même variables de configuration et que vous allez le trimbaler sur d'autre machines, c'est plus simple d'utiliser un fichier config comme celui là, et aussi pour mettre a jour le script c'est plus simple, un copier coller et c'est fini.
Donc vous avez une très bonne souplesse de configuration.

Ou encore si le fichier config doit pouvoir être modifier par d'autre utilisateur mais par mesure de sécurité pas le script.

Dernière modification par rraaffii (Le 04/08/2011, à 18:21)

Hors ligne

#3 Le 04/08/2011, à 21:26

yvon22

Re : Mettre en variable un fichier configuration

Bonjour,

Si j'ai bien compris, tu as un fichier contenant des données sous la formes Variable Valeur.
Tu fais une boucle sur le contenu du fichier

while read line; do
  ...
done < $fichier;

La variable line contient une ligne du fichier, donc le couple Variable Valeur et tu utilises la commande cut pour extraire le premier champ de la ligne, donc var contient la Variable.

Tu utilises la commande

cat $fichier | grep $var | cut -f 2 -d" " 

pour rechercher la valeur à associer à la variable, tu peux simplifier en utilisant

grep $var $fichier

qui fait la même chose que

cat $fichier | grep $var

Tu peux également simplifier de la manière suivante, la variable line contient les 2 valeurs recherchées, pourquoi ne pas lire la deuxième avec la commande

Valeur=$(echo $line | cut -f 2 -d" ")

Tu peux également simplifier ta boucle

while read line; do
  ...
done < $fichier;

en la remplaçant par

while read Variable Valeur; do
  ...
done < $fichier;

les valeurs recherchées seront directement présentes dans les variables Variable et Valeur sans utiliser grep, cut et autre.

Ta remarque en root la commande "source" ne fonctionne pas me laisse perplexe, j'ai un fichier couleur déclarant des variables :

BLACK='\e[0;30m'
WHITE='\e[1;37m'
LIGHTGRAY='\e[0;37m'
DARKGRAY='\e[1;30m'
RED='\e[0;31m'
GREEN='\e[0;32m'

Il est appelé depuis un autre script par la commande source ./couleur et cela fonctionne en tant que utilisateur standard ou en tant que root.

Hors ligne

#4 Le 05/08/2011, à 01:50

rraaffii

Re : Mettre en variable un fichier configuration

Salut.

Merci pour les  conseils.
Par contre pour :

Valeur=$(echo $line | cut -f 2 -d" ")

Ça retire tous le bute, qui est que la variable porte le nom du paramètre de configuration.

Ensuite moi quand je fait source en root :

$ sudo ./omg.sh
./omg.sh: 1: source: not found

Avec un utilisateur normale :

./omg.sh
/etc/server-manag/config: line 1: server_id : commande introuvable
/etc/server-manag/config: line 2: server_ip : commande introuvable
/etc/server-manag/config: line 3: server_webdir : commande introuvable
/etc/server-manag/config: line 4: server_gamedir : commande introuvable
/etc/server-manag/config: line 5: server_storagedir : commande introuvable

C'est un t'a d'erreur par se que j'ai pointé vers le fichier config fait comme dans le script mais il exécute...

Hors ligne

#5 Le 05/08/2011, à 01:57

rraaffii

Re : Mettre en variable un fichier configuration

Avec t'es amélioration :

fichier="/ton/fichier.cfg"
while read variable valeur; do
    echo $valeur > temp
    read $(echo $variable) < temp
done < $fichier

Beaucoup plus court, merci smile
Par contre je voie pas comment raccourcir sinon la variable ne porte plus le nom du paramètre.

Dernière modification par rraaffii (Le 05/08/2011, à 02:07)

Hors ligne

#6 Le 05/08/2011, à 08:17

yvon22

Re : Mettre en variable un fichier configuration

Bonjour,

J'ai fait un test rapide.
Mon fichier de variables :

 $  cat data.txt 
var1 val1
var2 val2

Mon fichier de commande :

 $  cat essai_var.sh 
#!/bin/bash
#
FicIn="data.txt"
  
while read Variable Valeur ; do
  echo -e "Variable = $Variable \tValeur = $Valeur"
  export $Variable=$Valeur
done < $FicIn

echo -e "\nControle des variables d'environnement :"
env | grep val

L'exécution en tant que root :

 $  ./essai_var.sh 
Variable = var1     Valeur = val1
Variable = var2     Valeur = val2

Controle des variables d'environnement :
var1=val1
var2=val2

J'ai fait le test sous Debian/Aptosid et j'utilise une session root (su -), je n'est pas de station sous Ubuntu,mais il faudrait vérifier s'il y a une différence entre un script lancé par

sudo ./mon-script.sh

et le même script lancé via une véritable session root

sudo su -

Peut être que la commande source sera vue dans ce cas.

Hors ligne