Kein Werkzeug außer /bin/sh
. Gegeben eine Vorlagendatei des Formulars
Version: ${version}
Path: ${path}
oder sogar mit gemischtem Shell-Code
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)
und eine Shell-analysierbare Konfigurationsdatei wie
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
es ist eine einfache Sache, dies zu erweitern
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
In der Tat müssen Sie angesichts des Pfads zur Konfigurationsdatei in der Shell-Variablen config_file
und des Pfads zur Vorlagendatei in template_file
nur Folgendes tun:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Dies ist vielleicht hübscher als ein vollständiges Shell-Skript als Vorlagendatei (@ mtinbergs Lösung).
Das vollständige naive Template-Expander-Programm:
#!/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
Dadurch wird die Erweiterung auf die Standardausgabe zurückgesetzt. leiten Sie die Standardausgabe einfach in eine Datei um, oder ändern Sie die obigen Einstellungen auf offensichtliche Weise, um die gewünschte Ausgabedatei zu erstellen.
Vorsichtsmaßnahmen: Die Erweiterung der Vorlagendatei funktioniert nicht, wenn die Datei Anführungszeichen enthält ( "
). Aus Sicherheitsgründen sollten wir wahrscheinlich einige offensichtliche Sicherheitsüberprüfungen einbeziehen oder, noch besser, eine Shell-Escape-Transformation durchführen, wenn die Vorlagendatei von einer externen Entität generiert wird.
Der einfachste Weg, dies in Linux CLI zu tun, ist die Verwendung von
envsubst
Umgebungsvariablen.Beispiel für eine Vorlagendatei
apache.tmpl
:envsubst
Ergebnis ausführen und in neue Datei ausgebenmy_apache_site.conf
:Ausgabe:
quelle
Sie sollten sich wahrscheinlich ein Konfigurationsmanagementsystem wie Puppet oder Chef ansehen . Diese können einfach das tun, was Sie oben beschrieben haben und vieles mehr.
quelle
name
wird der String<%= name %>
in einer Vorlage durchname
den Wert von ersetzt. Wie Siename
außerhalb der Vorlage definieren, unterscheidet sich offensichtlich zwischen den beiden Systemen.Wenn Sie schlanke und echte Vorlagen anstelle von Shell-Code wünschen, der neue Dateien generiert, sind die üblichen Optionen
sed
&awk
oderperl
. Hier ist ein Link: http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/Ich würde eine echte Sprache wie Perl, Tcl, Python, Ruby oder etwas anderes in dieser Klasse verwenden. Etwas für Skripte gebaut. Sie alle haben gute, einfache Vorlagenwerkzeuge und jede Menge Beispiele in Google.
quelle
Ich benutze shtpl . (Privates Projekt von mir, was bedeutet, es ist nicht weit verbreitet. Aber vielleicht möchten Sie es trotzdem testen)
Sie möchten zum Beispiel eine / etc / network / interfaces aus einer csv-Datei generieren und können dies folgendermaßen tun:
CSV-Dateiinhalt (hier test.csv):
Vorlage (hier interfaces.tpl):
Befehl:
Ergebnis:
Genießen!
quelle
Ich habe die Antwort von FooF verbessert, damit der Benutzer doppelte Anführungszeichen nicht manuell entfernen muss:
quelle
Ich habe kürzlich ein Bash-Skript veröffentlicht, das genau dies mithilfe einer jinja-ähnlichen Vorlagensyntax erreicht. Es heißt Cookie . Hier ist eine Demo:
quelle
Ich bin wahrscheinlich zu spät zu dieser Party. Ich stolperte jedoch über das gleiche Problem und entschied mich für die Erstellung meiner eigenen BASH-Template-Engine in ein paar Codezeilen:
Nehmen wir an, Sie haben Folgendes
file.template
:Und diese
rules
Datei:Sie führen diesen Befehl aus:
Du bekommst das:
Sie können es installieren, indem Sie:
Dies ist die Projekt - Website
quelle
Um die großartige Antwort von @ FooF zu erweitern (Zeilenumbrüche wurden nicht im Kommentar formatiert), können Sie mithilfe eines heredoc + Steuerzeichens beliebige Zeichen und Dateinamen zulassen :
Dies akzeptiert alle Nicht-Null-Zeichen und wird nur vorzeitig abgeschnitten, wenn 3
^D
Bytes in einer eigenen Zeile gefunden werden (realistisch nie). zsh unterstützt sogar Nullterminatoren,printf '\x00\x00\x00'
würde also funktionieren.template
funktioniert sogar für verräterische Dateinamen wie:Beachten Sie, dass Shell-Vorlagen beliebige Befehle "erweitern" können, z
$(launch_nukes.sh --target $(curl -sL https://freegeoip.app/csv/ | cut -d, -f 9,10))
. Mit großer Kraft ...Bearbeiten: Wenn Sie wirklich nicht möchten, dass Ihre Dateien Nukes auf Sie abfeuern, müssen Sie dies
sudo -u nobody sh
vorher tun (oder einem anderen sicheren Benutzer).quelle