No se necesitan herramientas que no sean /bin/sh
. Dado un archivo de plantilla del formulario
Version: ${version}
Path: ${path}
o incluso con código de shell mixto incluido
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)
y un archivo de configuración analizable de shell como
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
es simple expandir esto a
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
De hecho, dada la ruta al archivo de configuración en la variable de shell config_file
y la ruta al archivo de plantilla template_file
, todo lo que necesita hacer es:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Esto es quizás más bonito que tener un script de shell completo como archivo de plantilla (solución de @ mtinberg).
El programa completo de expansión de plantillas ingenuo:
#!/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
Esto generará la expansión a la salida estándar; simplemente redirija la salida estándar a un archivo o modifique lo anterior de manera obvia para producir el archivo de salida deseado.
Advertencias: la expansión del archivo de plantilla no funcionaría si el archivo contuviera comillas dobles sin escape ( "
). Por razones de seguridad, probablemente deberíamos incluir algunas comprobaciones de cordura obvias o, mejor aún, realizar una transformación de escape de shell si el archivo de plantilla es generado por una entidad externa.