Nenhuma ferramenta necessária além de /bin/sh
. Dado um arquivo de modelo do formulário
Version: ${version}
Path: ${path}
ou mesmo com código shell misto incluído
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)
e um arquivo de configuração analisável pelo shell como
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
é uma questão simples expandir isso para
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 fato, dado o caminho para o arquivo de configuração na variável shell config_file
e o caminho para o arquivo de modelo template_file
, tudo o que você precisa fazer é:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Talvez seja mais bonito do que ter um shell script completo como arquivo de modelo (a solução da @ mtinberg).
O programa completo de expansão de modelos ingênuos:
#!/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
Isso produzirá a expansão para a saída padrão; basta redirecionar a saída padrão para um arquivo ou modificar as opções acima de maneira óbvia para produzir o arquivo de saída desejado.
Advertências: a expansão do arquivo de modelo não funcionaria se o arquivo contivesse aspas duplas sem escape ( "
). Por motivos de segurança, provavelmente devemos incluir algumas verificações óbvias de integridade ou, melhor ainda, executar uma transformação de escape de shell se o arquivo de modelo for gerado por entidade externa.