Řešení 1:
To je velmi možné. Velmi jednoduchým způsobem, jak to implementovat, by bylo, aby soubor šablony byl ve skutečnosti skript a používal proměnné prostředí, jako je
#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
cat > /tmp/destfile <<-EOF
here is some config for version $version which should
also reference this path $path
EOF
Můžete to dokonce udělat konfigurovatelné na příkazovém řádku zadáním version=$1
a path=$2
, takže jej můžete spustit jako bash script /foo/bar/baz 1.2.3
. -
před tím, než EOF způsobí, že mezery budou ignorovány, použijte obyčejný <<EOF
pokud toto chování nechcete.
Dalším způsobem, jak toho dosáhnout, by bylo použití funkce hledání a nahrazení sed
#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
sed -e "s/VERSION/$version/g" -e "s/PATH/$path/" /path/to/templatefile > /tmp/destfile
který by nahradil každou instanci řetězců VERSION a PATH. Pokud existují jiné důvody, proč by tyto řetězce byly v souboru šablony, můžete hledat a nahradit je VERZE nebo %VERSION% nebo něco s menší pravděpodobností náhodného spuštění.
Řešení 2:
Nejjednodušší způsob, jak to udělat jednoduše v Linux CLI, je použít envsubst
a Proměnné prostředí.
Příklad souboru šablony apache.tmpl
:
<VirtualHost *:${PORT}>
ServerName ${SERVER_NAME}
ServerAlias ${SERVER_ALIAS}
DocumentRoot "${DOCUMENT_ROOT}"
</VirtualHost>
Spusťte envsubst
a výstup výsledku do nového souboru my_apache_site.conf
:
export PORT="443"
export SERVER_NAME="example.com"
export SERVER_ALIAS="www.example.com"
export DOCUMENT_ROOT="/var/www/html/"
envsubst < apache.tmpl > my_apache_site.conf
Výstup:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot "/var/www/html/"
</VirtualHost>
Řešení 3:
Nejsou potřeba žádné jiné nástroje než /bin/sh
. Daný soubor šablony formuláře
Version: ${version}
Path: ${path}
nebo dokonce se smíšeným kódem shellu
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)
a konfigurační soubor analyzovatelný shellem jako
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
je jednoduché to rozšířit na
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
Ve skutečnosti je daná cesta ke konfiguračnímu souboru v proměnné shellu config_file
a cestu k souboru šablony v template_file
, vše, co musíte udělat, je:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
To je možná hezčí než mít kompletní skript shellu jako soubor šablony (řešení @mtinberg).
Kompletní naivní program expandéru šablon:
#!/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
Tím dojde k výstupu rozšíření na standardní výstup; stačí přesměrovat standardní výstup do souboru nebo upravit výše uvedené zřejmým způsobem, aby se vytvořil požadovaný výstupní soubor.
Upozornění: Rozbalení souboru šablony by nefungovalo, pokud by soubor obsahoval dvojité uvozovky bez uvozovek ("
). Z bezpečnostních důvodů bychom pravděpodobně měli zahrnout některé zjevné kontroly zdravého rozumu nebo, ještě lépe, provést transformaci shellu escaping, pokud je soubor šablony generován externí entitou.
Řešení 4:
Pokud chcete spíše lehké a skutečné šablony než kód shellu, který generuje nové soubory, obvyklé možnosti jsou sed
&awk
nebo perl
. Zde je jeden odkaz:http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/
Já bych v té třídě použil skutečný jazyk jako perl, tcl, python, ruby nebo něco jiného. Něco stvořeného pro skriptování. Všechny mají dobré, jednoduché nástroje pro vytváření šablon a spoustu příkladů na Googlu.
Řešení 5:
K tomu používám shtpl. (můj soukromý projekt, což znamená, že není široce používán. Ale možná ho přesto chcete otestovat)
Chcete-li například vygenerovat /etc/network/interfaces ze souboru csv, můžete to udělat takto:
Obsah souboru CSV (zde test.csv):
eth0;10.1.0.10;255.255.0.0;10.1.0.1
eth1;192.168.0.10; 255.255.255.0;192.168.0.1
Šablona (zde interfaces.tpl):
#% IFS=';'
#% while read "Val1" "Val2" "Val3" "Val4"; do
auto $Val1
iface $Val1 inet static
address $Val2
netmask $Val3
gateway $Val4
#% done < "$CSVFILE"
Příkaz:
$ CSVFILE=test.csv sh -c "$( shtpl interfaces.tpl )"
Výsledek:
auto eth0
iface eth0 inet static
address 10.1.0.10
netmask 255.255.0.0
gateway 10.1.0.1
auto eth1
iface eth1 inet static
address 192.168.0.10
netmask 255.255.255.0
gateway 192.168.0.1
Užijte si to!