Никаких инструментов, кроме /bin/sh
. Дан файл шаблона формы
Version: ${version}
Path: ${path}
или даже со смешанным кодом оболочки
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)
и файл конфигурации, который можно разобрать
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
это просто, чтобы расширить это до
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
Действительно, учитывая путь к файлу конфигурации в переменной оболочки config_file
и путь к файлу шаблона template_file
, все, что вам нужно сделать, это:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Возможно, это красивее, чем иметь полный скрипт оболочки в качестве файла шаблона (решение @ mtinberg).
Полная наивная программа расширения шаблонов:
#!/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
Это выведет расширение на стандартный вывод; просто перенаправьте стандартный вывод в файл или измените вышеприведенное явно, чтобы получить желаемый выходной файл.
Предостережения: расширение файла шаблона не будет работать, если файл содержит неэкранированные двойные кавычки ( "
). По соображениям безопасности, нам, вероятно, следует включить некоторые очевидные проверки работоспособности или, что еще лучше, выполнить преобразование без оболочки, если файл шаблона генерируется внешней сущностью.