Часто для целей серверной автоматизации требуется генерация конфигурационных файлов.Предлагается использовать для этих целей следующую shell-конструкцию
*BSD:
#!/bin/sh
template_file='mytemplate'
myvar1='variable 1'
template=`cat ${template_file}`
eval "echo \"${template}\"" > ${config_file}
Linux:#!/bin/bash
template_file='mytemplate'
myvar1='variable 1'
template=`cat ${template_file}`
eval "echo \"${template}\"" > ${config_file}Переменная template_file содержит путь к шаблону, остальные переменные - данные для шаблона.
Последная строчка - ничто иное, как "движок" шаблонизатора, eval-вычисление строки-шаблона.Пример шаблона:
myvar = ${myvar1}
this is a \" quotes test \"
$(
if [ ! -z ${myvar2} ]; then
echo "myvar2 is set and its value = ${myvar2}"
fi
)
Важно отметить, что в шаблоне следует экранировать кавычки.
В шаблоне можно использовать не только подстановки значений, но и управляющие конструкции,
заключенные в скобки (см. пример шаблона).
URL: http://diso-go-go.livejournal.com
Обсуждается: http://www.opennet.me/tips/info/2065.shtml
Какую-то х...ню накопипастили, сами-то
проверяли...> eval "echo \"${template}\"" > ${config_file}
ambiguous redirect
> this is a \" quotes test \"
Это что за команда...
Макс удаляй нафиг, лажу копируют сюда!!!
все работает на ура, единственно что переменную указать config_file='test.conf'
not for lame users only (c)
>[оверквотинг удален]
>проверяли...
>
>> eval "echo \"${template}\"" > ${config_file}
>
>ambiguous redirect
>
>> this is a \" quotes test \"
>
>Это что за команда...
>Макс удаляй нафиг, лажу копируют сюда!!!Это не команда, это текст из файла с темплейтом. отсутствие определения переменной config_file поправил. Очень полезный совет, побольше бы таких присылали.
Спасибо за правку моего текста. Не стоило так торопиться при наборе )
Скоро, если не поленюсь, отправлю еще пару наработок по FreeBSD
Не понял цели.
Можно пример применения?
>Не понял цели.
>Можно пример применения?Ну, это что-то типа того, что обычно делается другими средствами... Вроде
sed <file.template >file.new "s/@@VAR1@@/$VAR1/g; s/@@VAR2@@/$VAR2/g;"
или
---8<--- /etc/init.d/bootmisc.sh, фрагмент
# Update motd
uname -snrvm > /var/run/motd
[ -f /etc/motd.tail ] && cat /etc/motd.tail >> /var/run/motd
я уже лет 5 на шелле рисую. в последние два года много и часто, но не понял идеи поста:)
>я уже лет 5 на шелле рисуюПопробуй читать чужие "рисунки"... "./configure", "make" и проч. -- не-е-епонятнейшие "головоломки". :>
> но не понял идеи поста:)
Моего? Одной из 6 других реплик? <<Полезного совета>>? Своего?? Раскажите об этом подробнее.
>[оверквотинг удален]
>Пример шаблона:
>
> myvar = ${myvar1}
> this is a \" quotes test \"
> $(
> if [ ! -z ${myvar2} ]; then
> echo "myvar2 is set and its value
>= ${myvar2}"
> fi
> )---8<---
#!/bin/bash
config_file='test.conf'
myvar1='variable 1'
cat <<TPLT > ${config_file}
myvar = ${myvar1}
this is a " quotes test "
$(
if [ ! -z ${myvar2} ]; then
echo "myvar2 is set and its value = ${myvar2}"
fi
)
TPLT
--->8---1. Одним файлом: шаблон как here-document в скрипте.
2. Кавычки не нужно экранировать. Нужно экранировать '$', если на выходе нужен сам этот символ.
3. У неортодоксальных нерелигиозных нефанатиков, освоивших установку $чего-то-там-про-пакеты, bash бывает и _не_ на ОС GNU/Linux (впрочем, как и не на ядре linux). Впрочем, безусловно, такие исключения только подтверждают правило, ога.
Вариация на тему Smarty. Транслятор шаблонов преобразует шаблон вида (см. ниже) в исполняемый шелл-скрипт:
./template.sh <virthost.tpl >virthost.tpl.sh
Транслятор шаблонов:#!/bin/sh
# $SUBSTITUTION
# <if $EXPR> ... <else> ... </if>
# <for ITEM in $LIST> ... </for>cat | sed -E -e 's/\\/\\\\\\\\/g' -e 's/"/\\"/g' -e 's/%/%%/g' \
-e 's/^(.*)$/printf "\1\\n"/' | \
sed -E -e 's/<if ([^>]*)>/"; if [ \1 ]; then printf "/' \
-e 's/<else>/"; else printf "/' \
-e 's/<\/if>/"; fi; printf "/' \
-e 's/<for ([^>]+)>/"; for \1; do printf "/' \
-e 's/<\/for>/"; done; printf "/'
Исходный шаблон:<VirtualHost $IP:$PORT>
ServerName $SITENAME
<if ${#ALIAS_LIST} -ne 0>
ServerAlias $ALIAS_LIST
</if>
ServerAdmin webmaster@$SITENAME
DocumentRoot /home/$USERNAME/www
CustomLog /home/$USERNAME/log/access.log combined
ErrorLog /home/$USERNAME/log/error.log
<Directory "/home/$USERNAME/www">
AllowOverride AuthConfig FileInfo Options Indexes Limit
Allow from all
</Directory>
php_admin_value open_basedir /home/$USERNAME:/var/tmp
php_admin_value upload_tmp_dir /home/$USERNAME/tmp
php_admin_value session.save_path /home/$USERNAME/tmp
php_admin_value error_log /home/$USERNAME/log/php.log
php_value include_path .:/home/$USERNAME/www/:
<if $USE_SSL = yes>
SSLEngine on
SSLCertificateFile /home/$USERNAME/keys/$SITENAME.crt
SSLCertificateKeyFile /home/$USERNAME/keys/$SITENAME.key
</if>
</VirtualHost>
Затем оттранслированный шаблон используется примерно так:IP="*"
PORT="80"
USERNAME=$ARG_USERNAME
SITENAME=$ARG_SITENAME
ALIAS_LIST="www.$ARG_SITENAME $ARG_ALIAS_LIST"
USE_SSL="no"
. virthost.tpl.sh >$CONF
А ты написал шаблонизатор на шелле? ^_^
> *BSD:
> #!/bin/sh
> ...
> Linux:
> #!/bin/bash
> ...феерично...