#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à
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
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