Aucun outil nécessaire autre que /bin/sh
. Étant donné un fichier modèle du formulaire
Version: ${version}
Path: ${path}
ou même avec un code shell mixte inclus
Version: ${version}
Path: ${path}
Cost: ${cost}\$
$(i=1; for w in one two three four; do echo Param${i}: ${w}; i=$(expr $i + 1); done)
et un fichier de configuration shell analysable comme
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
il est simple de l'étendre à
Version: 1.2.3-r42
Path: /some/place/under/the/rainbow/where/files/dance/in/happiness
Cost: 42$
Param1: one
Param2: two
Param3: three
Param4: four
En effet, étant donné le chemin d'accès au fichier de configuration dans la variable shell config_file
et le chemin d'accès au fichier modèle dans template_file
, il vous suffit de:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
C'est peut-être plus joli que d'avoir un script shell complet comme fichier modèle (solution de @ mtinberg).
Le programme d'extension de modèles naïf complet:
#!/bin/sh
PROG=$(basename $0)
usage()
{
echo "${PROG} <template-file> [ <config-file> ]"
}
expand()
{
local template="$(cat $1)"
eval "echo \"${template}\""
}
case $# in
1) expand "$1";;
2) . "$2"; expand "$1";;
*) usage; exit 0;;
esac
Cela produira l'extension à la sortie standard; redirigez simplement la sortie standard vers un fichier ou modifiez ce qui précède de manière évidente pour produire le fichier de sortie souhaité.
Avertissements: l' expansion du fichier modèle ne fonctionnerait pas si le fichier contenait des guillemets doubles ( "
). Pour des raisons de sécurité, nous devrions probablement inclure des vérifications de cohérence évidentes ou, mieux encore, effectuer une transformation d'échappement du shell si le fichier modèle est généré par une entité externe.
La façon la plus simple de le faire simplement dans Linux CLI est d'utiliser
envsubst
les variables d'environnement.Exemple de fichier modèle
apache.tmpl
:Exécuter
envsubst
et exporter le résultat vers un nouveau fichiermy_apache_site.conf
:Sortie:
la source
Vous devriez probablement envisager un système de gestion de configuration comme Puppet ou Chef . Ceux-ci peuvent facilement faire ce que vous décrivez ci-dessus et bien plus encore.
la source
name
, la chaîne<%= name %>
dans un modèle sera remplacée parname
la valeur de. La façon dont vous définissez enname
dehors du modèle diffère évidemment entre les deux systèmes.Si vous voulez des modèles légers et réels plutôt que du code shell qui génère de nouveaux fichiers, les choix habituels sont
sed
&awk
ouperl
. Voici un lien: http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/Moi, j'utiliserais un vrai langage comme perl, tcl, python, ruby ou autre chose dans cette classe. Quelque chose construit pour les scripts. Ils ont tous de bons outils de modélisation simples et des tonnes d'exemples dans Google.
la source
J'utilise shtpl pour ça. (mon projet privé, ce qui signifie qu'il n'est pas largement utilisé. Mais peut-être voulez-vous le tester quand même)
Par exemple, vous voulez générer un / etc / network / interfaces à partir d'un fichier csv, vous pouvez le faire comme ça:
Contenu du fichier CSV (ici test.csv):
Modèle (ici interfaces.tpl):
Commander:
Résultat:
Prendre plaisir!
la source
J'ai amélioré la réponse de FooF pour que l'utilisateur n'ait pas besoin d'effacer manuellement les guillemets doubles:
la source
J'ai récemment publié un script bash qui accomplit exactement cela en utilisant une syntaxe de modèle de type jinja. Cela s'appelle un cookie . Voici une démo:
la source
Je suis probablement en retard à cette fête. Cependant, je suis tombé sur le même problème et j'ai opté pour la création de mon propre moteur de modèle BASH en quelques lignes de code:
Disons que vous avez ceci
file.template
:Et ce
rules
fichier:Vous exécutez cette commande:
Vous obtenez ceci:
Vous pouvez l'installer en:
Ceci est le site du projet
la source
Pour développer la grande réponse de @ FooF (les nouvelles lignes n'ont pas été formatées dans les commentaires), en utilisant un caractère de contrôle hérédoc +, vous pouvez autoriser des caractères et des noms de fichiers arbitraires :
Cela accepte tout caractère non nul et ne tronque tôt que si 3
^D
octets sont rencontrés sur leur propre ligne (en réalité jamais). zsh prend même en charge les terminateurs nuls, doncprintf '\x00\x00\x00'
cela fonctionnerait.template
fonctionne même pour les noms de fichiers perfides comme:Méfiez-vous des modèles de shell peuvent "étendre" des commandes arbitraires, par exemple
$(launch_nukes.sh --target $(curl -sL https://freegeoip.app/csv/ | cut -d, -f 9,10))
. Avec une grande puissance…Edit: si vous ne voulez vraiment pas que vos fichiers lancent des armes nucléaires, juste
sudo -u nobody sh
(ou un autre utilisateur sûr) au préalable.la source