Подтвердить что ты не робот

Создайте новый файл из шаблонов с помощью bash script

Мне нужно создать файлы conf и init.d, которые очень похожи. Эти файлы позволяют развернуть новую службу http на моих серверах. Эти файлы одинаковы, и только некоторые параметры изменяются из одного файла в другой (listen_port, домен, путь на сервере...).

Как любая ошибка в этих файлах приводит к неправильной работе службы, я хотел бы создать эти файлы с помощью bash script.

Например:

generate_new_http_service.sh 8282 subdomain.domain.com /home/myapp/rootOfHTTPService

Я ищу своего рода модуль шаблонов, который я мог бы использовать с bash. Этот шаблонный модуль будет использовать некоторые общие сценарии conf и init.d для создания новых.

Есть ли у вас намеки? Если нет, я могу использовать механизм программирования шаблонов python.

4b9b3361

Ответ 1

Вы можете сделать это, используя heredoc. например.

generate.sh:

#!/bin/sh

#define parameters which are passed in.
PORT=$1
DOMAIN=$2

#define the template.
cat  << EOF
This is my template.
Port is $PORT
Domain is $DOMAIN
EOF

Вывод:

$ generate.sh 8080 domain.com

This is my template.
Port is 8080
Domain is domain.com

или сохраните его в файле:

$ generate.sh 8080 domain.com > result

Ответ 2

Модуль шаблона для bash? Используйте sed, Люк! Вот пример одного из миллионов возможных способов сделать это:

$ cat template.txt 
#!/bin/sh

echo Hello, I am a server running from %DIR% and listening for connection at %HOST% on port %PORT% and my configuration file is %DIR%/server.conf

$ cat create.sh 
#!/bin/sh

sed -e "s;%PORT%;$1;g" -e "s;%HOST%;$2;g" -e "s;%DIR%;$3;g" template.txt > script.sh

$ bash ./create.sh 1986 example.com /tmp
$ bash ./script.sh 
Hello, I am a server running from /tmp and listening for connection at example.com on port 1986 and my configuration file is /tmp/server.conf
$ 

Ответ 3

вы можете сделать это прямо в bash, вам даже не нужно sed. Напишите script следующим образом:

#!/bin/bash

cat <<END
this is a template
with $foo
and $bar
END

затем назовите его так:

foo=FOO bar=BAR ./template 

Ответ 4

Для простого создания файлов, в основном делая

 . "${config_file}"
 template_str=$(cat "${template_file}")
 eval "echo \"${template_str}\""

было бы достаточно.

Здесь ${config_file} содержит конфигурационные переменные в формате синтаксического анализа, а ${template_file} - это файл шаблона, который выглядит как документ shell здесь. Первые строки в файле ${config_file}, вторая строка помещает содержимое файла ${template_file} в переменную оболочки template_str. Наконец, в третьей строке мы создаем команду оболочки echo "${template_str}" (где расширенное выражение с двойным кавычкой "${template_str}") и оцениваем его.

Пример содержимого этих двух файлов см. https://serverfault.com/a/699377/120756.

Существуют ограничения, которые могут возникнуть в файле шаблона, или вам нужно выполнить экранирование оболочки. Кроме того, если файл шаблона создается извне, то по соображениям безопасности вам необходимо рассмотреть возможность правильной фильтрации перед выполнением, чтобы вы, например, не потеряли файлы, когда кто-то вводит знаменитый $(rm -rf /) в файл шаблона.

Ответ 5

Вы можете использовать класс python string.Template

$ echo 'before $X after' > template.txt

$ python  -c 'import string; print(string.Template(open("template.txt").read()).substitute({"X":"A"}))'

before A after

или

$  python  -c 'import string, sys; print(string.Template(open("template.txt").read()).substitute({"X":sys.argv[1]}))' "A"

Здесь $X является заполнителем в шаблоне, а {"X":"A"} является отображением заполнителя для значения. В коде python мы читаем текст шаблона из файла, создаем из него шаблон, а затем заменяем заполнитель аргументом командной строки.

В качестве альтернативы вы можете использовать Ruby ERB, если Ruby установлен на вашем компьютере.

$ echo "before <%= ENV['X'] %> after" > template.txt

$ X=A erb template.txt

before A after

Здесь <%= ENV['X'] %> является заполнителем. ENV['X'] считывает значение из переменной окружения. X=A устанавливает переменную окружения в нужное значение.

Ответ 6

Вот как я сделал для себя:

. "${config_file}"
eval "cat << EOF
$(cat ${template_file})
EOF"

и если вы хотите поместить его в файл конфигурации:

. "${config_file}"
eval "cat > /etc/MY_SERVICE/MY_CONFIG << EOF
$(cat ${template_file})
EOF"

Таким образом, вам не нужно создавать дополнительную переменную.