The OpenNET Project / Index page

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

Шаблонизатор на shell
Часто для целей серверной автоматизации требуется генерация конфигурационных файлов.

Предлагается использовать для этих целей следующую shell-конструкцию

*BSD:

   #!/bin/sh
   config_file='test.conf'
   template_file='mytemplate'
   myvar1='variable 1'
   template=`cat ${template_file}`
   eval "echo \"${template}\"" > ${config_file}


Linux:

   #!/bin/bash
   config_file='test.conf'
   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
   )
   
Важно отметить, что в шаблоне следует экранировать кавычки.
В шаблоне можно использовать не только подстановки значений, но и управляющие конструкции, 
заключенные в скобки (см. пример шаблона).
 
13.05.2009 , Автор: Denis Nasyrtdinov , Источник: http://diso-go-go.livejournal.com...
Ключи: shell, template
Раздел:    Корень / Программисту и web-разработчику / Shell / Готовые скрипты

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, pavlinux (ok), 01:39, 14/05/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Какую-то х...ню накопипастили, сами-то
    проверяли...

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

    ambiguous redirect

    > this is a \" quotes test \"

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

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

     
     
  • 2.2, Гость (?), 07:41, 14/05/2009 [^] [^^] [^^^] [ответить]  
  • +/
    все работает на ура, единственно что переменную указать config_file='test.conf'
     
  • 2.3, stellar (??), 10:55, 14/05/2009 [^] [^^] [^^^] [ответить]  
  • +/
    not for lame users only (c)
     
  • 2.4, Maxim Chirkov (ok), 11:01, 14/05/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >[оверквотинг удален]
    >проверяли...
    >
    >> eval "echo \"${template}\"" > ${config_file}
    >
    >ambiguous redirect
    >
    >> this is a \" quotes test \"
    >
    >Это что за команда...
    >Макс удаляй нафиг, лажу копируют сюда!!!

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


     
     
  • 3.5, Denis Nasyrtdinov (?), 11:40, 14/05/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо за правку моего текста. Не стоило так торопиться при наборе )
    Скоро, если не поленюсь, отправлю еще пару наработок по FreeBSD
     

  • 1.6, XoRe (ok), 12:49, 14/05/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не понял цели.
    Можно пример применения?
     
     
  • 2.7, Andrey Mitrofanov (?), 13:05, 14/05/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Не понял цели.
    >Можно пример применения?

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

    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

     
     
  • 3.8, Аноним (-), 22:45, 14/05/2009 [^] [^^] [^^^] [ответить]  
  • +/
    я уже лет 5 на шелле рисую. в последние два года много и часто, но не понял идеи поста:)
     
     
  • 4.9, Andrey Mitrofanov (?), 10:24, 15/05/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >я уже лет 5 на шелле рисую

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

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

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

     

  • 1.10, Andrey Mitrofanov (?), 10:47, 15/05/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >[оверквотинг удален]
    >Пример шаблона:
    >
    >   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). Впрочем, безусловно, такие исключения только подтверждают правило, ога.

     
  • 1.11, keeper (ok), 11:48, 18/05/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вариация на тему 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


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

     
  • 1.12, osintsev (?), 14:41, 19/05/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > *BSD:
    >   #!/bin/sh
    >  ...
    > Linux:
    >   #!/bin/bash
    >  ...

    феерично...

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

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