Шаблоны Bash: Как создавать файлы конфигурации из шаблонов с помощью Bash? - PullRequest
107 голосов
/ 26 мая 2010

Я пишу скрипт для автоматизации создания файлов конфигурации для Apache и PHP для моего собственного веб-сервера.Я не хочу использовать какие-либо графические интерфейсы, такие как CPanel или ISPConfig.

У меня есть несколько шаблонов конфигурационных файлов Apache и PHP.Bash-скрипт должен читать шаблоны, производить подстановку переменных и выводить проанализированные шаблоны в какую-то папку.Каков наилучший способ сделать это?Я могу придумать несколько способов.Какой из них лучший или может быть есть лучшие способы сделать это?Я хочу сделать это в чистом Bash (это легко в PHP, например)

1) Как заменить $ {} заполнителей в текстовом файле?

шаблон.txt:

the number is ${i}
the word is ${word}

script.sh:

#!/bin/sh

#set variables
i=1
word="dog"
#read in template one line at the time, and replace variables
#(more natural (and efficient) way, thanks to Jonathan Leffler)
while read line
do
    eval echo "$line"
done < "./template.txt"

Кстати, как мне перенаправить вывод во внешний файл?Нужно ли что-то экранировать, если переменные содержат, скажем, кавычки?

2) Использование cat & sed для замены каждой переменной ее значением:

Данный template.txt:

The number is ${i}
The word is ${word}

Команда:

cat template.txt | sed -e "s/\${i}/1/" | sed -e "s/\${word}/dog/"

Мне кажется плохим из-за необходимости экранировать много разных символов, и со многими переменными строка будет слишком длинной.

Можете ли вы вспомнить некоторыедругое элегантное и безопасное решение?

Ответы [ 22 ]

0 голосов
/ 22 декабря 2016

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

perl -pe 's/([^\\]|^)\$\{([a-zA-Z_][a-zA-Z_0-9]*)\}/$1.$ENV{$2}/eg' -i template

Функции (в зависимости от моих потребностей, но их легко изменить):

  • Пропускает раскрытие расширенных параметров (например, \ $ {VAR}).
  • Поддерживает расширения параметров в форме $ {VAR}, но не в $ VAR.
  • Заменяет $ {VAR} пустой строкой, если нет VAR envar.
  • Поддерживает только символы a-z, A-Z, 0-9 и подчеркивания в имени (исключая цифры в первой позиции).
0 голосов
/ 01 января 2016

Вот функция bash, которая сохраняет пробелы:

# Render a file in bash, i.e. expand environment variables. Preserves whitespace.
function render_file () {
    while IFS='' read line; do
        eval echo \""${line}"\"
    done < "${1}"
}
...