53 votes

Meilleure façon de lire un fichier de configuration en bash

Quelle est la meilleure façon de lire un fichier de configuration en bash ?
Par exemple, vous avez un script et vous ne voulez pas remplir toute la configuration manuellement chaque fois que vous appelez le script.

Editer 1 : Je pense que je n'ai pas été assez clair, donc : ce que je veux c'est... J'ai un fichier de configuration qui ressemble à

variable_name value  
variable_name value ...  

et je veux le lire. Je sais que je pourrais simplement chercher les arguments que je cherche dans la base de données... mais il y a peut-être une façon plus intelligente :)

76voto

muru Points 180007

Comme l'a dit mbiber, source un autre dossier. Par exemple, votre fichier de configuration (disons some.config ) serait :

var1=val1
var2=val2

Et votre script pourrait ressembler à ceci :

#! /bin/bash

# Optionally, set default values
# var1="default value for var1"
# var1="default value for var2"

. /path/to/some.config

echo "$var1" "$var2"

Les nombreux fichiers dans /etc/default servent généralement de fichiers de configuration pour d'autres Shell Shell de la même manière. Un exemple très courant des messages postés ici est /etc/default/grub . Ce fichier est utilisé pour définir les options de configuration de Grub, puisque grub-mkconfig est un Shell Shell qui le source :

sysconfdir="/etc"
#…
if test -f ${sysconfdir}/default/grub ; then
  . ${sysconfdir}/default/grub
fi

Si vous devez vraiment traiter la configuration du formulaire :

var1 some value 1
var2 some value 2

Vous pourriez alors faire quelque chose comme :

while read var value
do
    export "$var"="$value"
done < /path/to/some.config

(Vous pouvez également faire quelque chose comme eval "$var=$value" mais c'est plus risqué que d'utiliser un script. Vous pourriez le casser par inadvertance plus facilement qu'un fichier sourcé).

8voto

mbiber Points 750

Utilisation source o . pour charger un fichier.

source /path/to/file

o

. /path/to/file

Il est également recommandé de vérifier si le fichier existe avant de le charger, car vous ne voulez pas continuer à exécuter votre script si un fichier de configuration n'est pas présent.

4voto

Jacob Vlijm Points 78990

Il est évident que je ne suis pas le bash mais le concept ne devrait pas être différent quelle que soit la langue utilisée :

Un exemple

Dans l'exemple ci-dessous, vous pouvez utiliser un script (très) basique pour soit fixer une chaîne de caractères, ou imprimer une chaîne, telle que définie dans votre fichier de configuration :

#!/bin/bash

# argument to set a new string or print the set string
arg=$1
# possible string as second argument
string=$2
# path to your config file
configfile="$HOME/stringfile"

# if the argument is: "set", write the string (second argument) to a file
if [ "$arg" == "set" ]
then
echo "$string" > $configfile 
# if the argunment is "print": print out the set string, as defined in your file
elif [ "$arg" == "print" ]
then 
echo "$( cat $configfile )"
fi

Dans ce cas

  • Pour insérer une chaîne de caractères dans votre fichier de configuration :

    $ '/home/jacob/Bureaublad/test.sh' set "Een aap op een fiets, hoe vind je zoiets?"
  • Ensuite, pour imprimer la chaîne, telle que définie dans votre "fichier de configuration" :

    $ '/home/jacob/Bureaublad/test.sh' print
    Een aap op een fiets, hoe vind je zoiets?

Bien sûr, dans un script réellement appliqué, vous devez ajouter beaucoup de choses pour vous assurer que les arguments sont corrects, décider de ce qu'il faut faire lorsque l'entrée est incorrecte, que le fichier de configuration n'existe pas, etc :

Voici l'idée de base

1voto

smARTin Points 21

J'utilise celui-ci...

#!/bin/bash

CFG_FILE=/etc/test.conf
CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g')
eval "$CFG_CONTENT"

Le fichier Conf est analysé avec sed puis évalué comme de simples assignations de variables.

First sed parsing key values (supporte aussi = entouré d'espaces)

Le deuxième sed supprime les espaces autour du signe = pour une affectation valide des variables.

D'autres traitements peuvent être ajoutés

Tout autre texte ne correspondant pas dans le fichier conf sera supprimé (y compris les commentaires # ou ; et autres).

Attention, les commandes Shell d'une seule ligne peuvent également être évaluées à partir de ce fichier de configuration !

1voto

Yordan Georgiev Points 171
#------------------------------------------------------------------------------
# parse the ini like $0.$host_name.cnf and set the variables
# cleans the unneeded during after run-time stuff. Note the MainSection
# courtesy of : http://mark.aufflick.com/blog/2007/11/08/parsing-ini-files-with-sed
#------------------------------------------------------------------------------
doParseConfFile(){
    # set a default cnfiguration file
    cnf_file="$run_unit_bash_dir/$run_unit.cnf"

    # however if there is a host dependant cnf file override it
    test -f "$run_unit_bash_dir/$run_unit.$host_name.cnf" \
    && cnf_file="$run_unit_bash_dir/$run_unit.$host_name.cnf"

    # yet finally override if passed as argument to this function
    # if the the ini file is not passed define the default host independant ini file
    test -z "$1" || cnf_file=$1;shift 1;

    test -z "$2" || ini_section=$2;shift 1;
    doLog "DEBUG read configuration file : $cnf_file"
    doLog "INFO read [$ini_section] section from config file"

    # debug echo "@doParseConfFile cnf_file:: $cnf_file"
    # coud be later on parametrized ...
    test -z "$ini_section" && ini_section='MAIN_SETTINGS'

    doLog "DEBUG reading: the following configuration file"
    doLog "DEBUG ""$cnf_file"
    ( set -o posix ; set ) | sort >"$tmp_dir/vars.before"

    eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$ini_section\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

    ( set -o posix ; set ) | sort >"$tmp_dir/vars.after"

    doLog "INFO added the following vars from section: [$ini_section]"
    cmd="$(comm -3 $tmp_dir/vars.before $tmp_dir/vars.after | perl -ne 's#\s+##g;print "\n $_ "' )"
    echo -e "$cmd"
    echo -e "$cmd" >> $log_file
    echo -e "\n\n"
    sleep 1; printf "\033[2J";printf "\033[0;0H" # and clear the screen
}
#eof func doParseConfFile

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X