Как я могу сценарий генерации файла из шаблона с помощью Bash? - PullRequest
7 голосов
/ 12 января 2012

Я пытаюсь автоматизировать настройку создания сайта для нашего собственного сервера разработки.

В настоящее время это состоит из создания системного пользователя, пользователя mysql, базы данных и конфигурации Apache. Я знаю, как я могу сделать все в одном файле bash, но я хотел спросить, есть ли способ более аккуратно сгенерировать конфигурацию apache.

По сути, я хочу создать conf-файл на основе шаблона, аналогичного использованию printf. Я, конечно, мог бы использовать printf, но я думал, что может быть более чистый способ, используя sed или awk.

Причина, по которой я не просто хочу использовать printf, заключается в том, что конфигурация apache имеет длину около 20 строк и будет занимать большую часть скрипта bash, а также усложнит его чтение.

Любая помощь приветствуется.

Ответы [ 3 ]

10 голосов
/ 13 января 2012

Выберите способ маркировки параметров.Одна возможность - :parameter:, но любая подобная пара маркеров, которую не следует путать с допустимым текстом для файла (ов) шаблона, хороша.

Написать сценарий sedsed,awk, perl, ...) аналогично следующему:

sed -e "s/:param1:/$param1/g" \
    -e "s/:param2:/$param2/g" \
    -e "s/:param3:/$param3/g" \
    httpd.conf.template > $HTTPDHOME/etc/httpd.conf

Если вы попадаете в точку, где вам иногда нужно что-то редактировать, а иногда нет, вам может показаться, что это прощечтобы создать соответствующие команды sed в командном файле, а затем выполнить это:

{
echo "s/:param1:/$param1/g"
echo "s/:param2:/$param2/g"
echo "s/:param3:/$param3/g"
if [ "$somevariable" = "somevalue" ]
then echo "s/normaldefault/somethingspecial/g"
fi
} >/tmp/sed.$$
sed -f /tmp/sed.$$ httpd.conf.template > $HTTPDHOME/etc/httpd.conf

Обратите внимание, что вы должны использовать ловушку, чтобы убедиться, что временная программа не утратила свою полезность:

tmp=/tmp/sed.$$   # Consider using more secure alternative schemes
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15  # aka EXIT HUP INT QUIT PIPE TERM
...code above...
rm -f $tmp
trap 0

Это гарантирует, что ваш временный файл будет удален при выходе из сценария для наиболее вероятных сигналов.Вы можете сохранить ненулевой статус выхода из предыдущих команд и использовать exit $exit_status после команды trap 0.

5 голосов
/ 13 января 2012

Я удивлен, что никто не упомянул здесь документы.Вероятно, это не то, чего хочет ОП, но, безусловно, способ улучшить разборчивость сценария, с которого вы начали.Просто позаботьтесь о том, чтобы избежать или параметризовать любые конструкции, на которые оболочка будет выполнять подстановки.

#!/bin/sh
# For example's sake, a weird value
# This is in single quotes, to prevent substitution
literal='$%"?*=`!!'
user=me

cat <<HERE >httpd.conf
# Not a valid httpd.conf
User=${user}
Uninterpolated=${literal}
Escaped=\$dollar
HERE

В этом контексте я бы порекомендовал $ {variable} вместо эквивалентной переменной $ для ясности и во избежание любой возможной неоднозначности..

1 голос
/ 12 января 2012

Используйте sed, например,

sed s/%foo%/$foo/g template.conf > $newdir/httpd.conf
...