Quelle est la meilleure façon de lire un fichier de configuration dans bash?
Par exemple, vous avez un script et vous ne souhaitez pas remplir manuellement toutes les configurations chaque fois que vous appelez le script.
Edit 1: Je pense que je n'ai pas été clair, donc: ce que je veux c'est ... J'ai un fichier de configuration qui est comme
variable_name value
variable_name value ...
et je veux lire ça. Je sais que je pourrais simplement le chercher pour les arguments que je recherche ou alors ... mais peut-être qu'il y a un moyen plus intelligent :)
Réponses:
Comme l'a dit mbiber,
source
un autre fichier. Par exemple, votre fichier de configuration (disonssome.config
) serait:Et votre script pourrait ressembler à:
Les nombreux fichiers dans
/etc/default
servent généralement de fichiers de configuration pour d'autres scripts shell de la même manière. Un exemple très courant des publications ici est/etc/default/grub
. Ce fichier est utilisé pour définir les options de configuration de GRUB, car ilgrub-mkconfig
s'agit d'un script shell qui le source:Si vous devez vraiment traiter la configuration du formulaire:
Ensuite, vous pourriez faire quelque chose comme:
(Vous pouvez également faire quelque chose comme
eval "$var=$value"
, mais c'est plus risqué que de sourcer un script. Vous pouvez par inadvertance le casser plus facilement qu'un fichier source.)la source
=
depuis le début?/etc/default
- et surtout à bon escient. Si votre utilisateur désemparé a accès à la configuration de quelque chose qui s'exécute en tant que root, c'est déjà une cause perdue.Évidemment, je ne suis pas le
bash
spécialiste ici, mais le concept ne devrait pas être différent dans la langue que vous utilisez:Un exemple
Dans l'exemple ci-dessous, vous pouvez utiliser un script (très) basique pour définir une chaîne ou imprimer une chaîne, comme défini dans votre fichier de configuration:
ensuite
Pour définir une chaîne dans votre fichier de configuration:
Par la suite, pour imprimer la chaîne, telle que définie dans votre "fichier de configuration":
Bien sûr, dans un vrai script appliqué, vous devez ajouter beaucoup de choses pour vous assurer que les arguments sont corrects, décider quoi faire lorsque la saisie est incorrecte, le fichier de paramètres n'existe pas, etc., mais:
Telle est l'idée de base
la source
Utilisez
source
ou.
pour charger dans un fichier.ou
Il est également recommandé de vérifier si le fichier existe avant de le charger car vous ne souhaitez pas continuer à exécuter votre script si aucun fichier de configuration n'est présent.
la source
J'utilise celui-ci ...
Le fichier de configuration est analysé avec sed puis évalué comme de simples affectations de variables
Premier sed analysant les valeurs clés (prend également en charge = entouré d'espaces)
Le deuxième sed supprime les espaces autour de = signe pour une affectation de variable valide
Un traitement sed supplémentaire peut être ajouté
Tout autre texte ne correspondant pas dans le fichier conf sera supprimé (y compris # ou; commentaire et autres)
Sachez que les commandes shell sur une seule ligne peuvent également être évaluées à partir de ce fichier de configuration!
la source
cat
. Pourquoi invoquez-voussed
deux fois de suite? Vous pouvez enchaîner dessed
commandes comme ceci:sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g'
sed
commande générera une sortie vide pour les exemples d'entrées de fichier de configuration dans la question. -1.
commande et la redirection de processus au lieu de variables temporaires pour conserver la sortie du sous-processus:. <(sed ... "$CFG_FILE")
eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE")
ce qui est beaucoup mieux pour comprendre ce qui se passe..
attend un fichier et la substitution de processus est étendue à un fichier.. <(echo echo foo)
fonctionne exactement comme prévu dans Bash v4.3.11. Dans de petits exemples, cela n'aura probablement pas d'importance. Je préfère cependant ne pas passer plusieurs kilo-octets par substitution de commande.la source