Никаких инструментов, кроме /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
Это выведет расширение на стандартный вывод; просто перенаправьте стандартный вывод в файл или измените вышеприведенное явно, чтобы получить желаемый выходной файл.
Предостережения: расширение файла шаблона не будет работать, если файл содержит неэкранированные двойные кавычки ( "
). По соображениям безопасности, нам, вероятно, следует включить некоторые очевидные проверки работоспособности или, что еще лучше, выполнить преобразование без оболочки, если файл шаблона генерируется внешней сущностью.
Самый простой способ сделать это просто в Linux CLI - это использовать
envsubst
переменные среды.Пример файла шаблона
apache.tmpl
:Запустите
envsubst
и выведите результат в новый файлmy_apache_site.conf
:Выход:
источник
Вы, вероятно, должны изучить систему управления конфигурацией, например, Puppet или Chef . Они могут легко сделать то, что вы описали выше и многое другое.
источник
name
строка<%= name %>
в шаблоне будет замененаname
значением 's'. То, как вы определяетеname
вне шаблона, очевидно, отличается между двумя системами.Если вам нужны легкие и настоящие шаблоны, а не код оболочки, который генерирует новые файлы, обычно выбирайте
sed
&awk
илиperl
. Вот одна ссылка: http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/Я бы использовал реальный язык, такой как perl, tcl, python, ruby или что-то еще в этом классе. Нечто построенное для сценариев. Все они имеют хорошие, простые инструменты для создания шаблонов и множество примеров в Google.
источник
Я использую shtpl для этого. (мой частный проект, что означает, что он не широко используется. Но, может быть, вы все равно хотите его протестировать)
Например, вы хотите сгенерировать / etc / network / interfaces из csv-файла, вы можете сделать это так:
Содержимое CSV-файла (здесь test.csv):
Шаблон (здесь interfaces.tpl):
Команда:
Результат:
Наслаждайтесь!
источник
Я улучшил ответ FooF, чтобы пользователю не нужно было удалять двойные кавычки вручную:
источник
Недавно я опубликовал bash-скрипт, который выполняет это, используя jinja-подобный шаблонный синтаксис. Это называется cookie . Вот демо:
источник
Я, наверное, опоздал на эту вечеринку. Однако я наткнулся на ту же проблему и решил создать свой собственный шаблонный движок BASH в несколько строк кода:
Допустим, у вас есть это
file.template
:И этот
rules
файл:Вы выполняете эту команду:
Вы получаете это:
Вы можете установить его:
Это сайт проекта
источник
Чтобы расширить великолепный ответ @ FooF (строки не форматируются в комментариях), используя heredoc + управляющие символы, вы можете разрешить произвольные символы и имена файлов:
Это принимает любой ненулевой символ и усекает только рано, если 3
^D
байта встречаются в их собственной строке (реально никогда). Zsh даже поддерживает нулевые терминаторы, такprintf '\x00\x00\x00'
что будет работать.template
даже работает для коварных имен файлов, таких как:Осторожно, шаблоны оболочки могут «расширять» произвольные команды, например
$(launch_nukes.sh --target $(curl -sL https://freegeoip.app/csv/ | cut -d, -f 9,10))
. С большой силой ...Редактировать: если вы действительно не хотите, чтобы ваши файлы запускали ядерное оружие, просто
sudo -u nobody sh
(или другого безопасного пользователя) заранее.источник