The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Шаблонизатор на shell"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Шаблонизатор на shell"  +/
Сообщение от auto_tips (ok) on 14-Май-09, 01:39 
Часто для целей серверной автоматизации требуется генерация конфигурационных файлов.

Предлагается использовать для этих целей следующую 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.ru/tips/info/2065.shtml

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по ответам | RSS]

1. "Шаблонизатор на shell"  +/
Сообщение от pavlinux (ok) on 14-Май-09, 01:39 
Какую-то х...ню накопипастили, сами-то
проверяли...

> eval "echo \"${template}\"" > ${config_file}

ambiguous redirect

> this is a \" quotes test \"

Это что за команда...

Макс удаляй нафиг, лажу копируют сюда!!!

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Шаблонизатор на shell"  +/
Сообщение от Гость on 14-Май-09, 07:41 
все работает на ура, единственно что переменную указать config_file='test.conf'
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Шаблонизатор на shell"  +/
Сообщение от stellar (??) on 14-Май-09, 10:55 
not for lame users only (c)
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Шаблонизатор на shell"  +/
Сообщение от Maxim Chirkov (ok) on 14-Май-09, 11:01 
>[оверквотинг удален]
>проверяли...
>
>> eval "echo \"${template}\"" > ${config_file}
>
>ambiguous redirect
>
>> this is a \" quotes test \"
>
>Это что за команда...
>Макс удаляй нафиг, лажу копируют сюда!!!

Это не команда, это текст из файла с темплейтом. отсутствие определения переменной config_file поправил. Очень полезный совет, побольше бы таких присылали.


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Шаблонизатор на shell"  +/
Сообщение от Denis Nasyrtdinov email on 14-Май-09, 11:40 
Спасибо за правку моего текста. Не стоило так торопиться при наборе )
Скоро, если не поленюсь, отправлю еще пару наработок по FreeBSD
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "Шаблонизатор на shell"  +/
Сообщение от XoRe (ok) on 14-Май-09, 12:49 
Не понял цели.
Можно пример применения?
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Шаблонизатор на shell"  +/
Сообщение от Andrey Mitrofanov on 14-Май-09, 13:05 
>Не понял цели.
>Можно пример применения?

Ну, это что-то типа того, что обычно делается другими средствами... Вроде

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Шаблонизатор на shell"  +/
Сообщение от Аноним (??) on 14-Май-09, 22:45 
я уже лет 5 на шелле рисую. в последние два года много и часто, но не понял идеи поста:)
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

9. "Шаблон и затор на shell"  +/
Сообщение от Andrey Mitrofanov on 15-Май-09, 10:24 
>я уже лет 5 на шелле рисую

Попробуй читать чужие "рисунки"... "./configure", "make" и проч. -- не-е-епонятнейшие "головоломки". :>

> но не понял идеи поста:)

Моего? Одной из 6 других реплик? <<Полезного совета>>? Своего?? Раскажите об этом подробнее.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

10. "Раздел полезных советов: Шаблонизатор на shell"  +/
Сообщение от Andrey Mitrofanov on 15-Май-09, 10:47 
>[оверквотинг удален]
>Пример шаблона:
>
>   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). Впрочем, безусловно, такие исключения только подтверждают правило, ога.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

11. "Шаблонизатор на shell"  +/
Сообщение от keeper email(ok) on 18-Май-09, 11:48 
Вариация на тему 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


А ты написал шаблонизатор на шелле? ^_^

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

12. "Шаблонизатор на shell"  +/
Сообщение от osintsev on 19-Май-09, 14:41 
> *BSD:
>   #!/bin/sh
>  ...
> Linux:
>   #!/bin/bash
>  ...

феерично...

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру