[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Bash скрипт
AllesKlar
Доброго всем.

В bash опыта маловато, знаком на уровне "как дела, чем вечером занимаешься?"

Задача:
из репозитария берется php файл а-ля конфиг.
В нем присутсвуют инструкции вида

define('CONST', '');
$config['part']['subpart'] = '';

и т.д.

Т.е. либо объявленны константы, либо переменые, все с пустыми значениями.

Что известно:
- имена констант;
- имена переменных;
- значения, которыми их нужно проинициализировать;

Что гарантировано?
- синтаксис php

В чем загвоздка?
Скрипт должен корекно прописать значение переменной при любом верном синтаксисе php.

Подробнее в примере.
Допустим, мы знаем, что $config['part']['subpart'] должно быть равно "value";
На первый взгляд напрашивается замена в лоб
sed -ie s/"\$config['part']['subpart']=''"/"\$config['part']['subpart']='value'"/ "config.php"


НО:
Программист Иван Пертров, который последним коммитил репозитарий, изменил кавычки, заодно разнес запись о переменной на несколько строк, да еще и забыл удалить из нее тестовое значение.
Итог, в репозитарии лежит не $config['part']['subpart'] = '';
а

$config['part']["subpart"] 
=

"Udachi v otladke"
;


Синтаксис верен, просто кавычки разные, переменная записана на нескольких строках и значение не стерто.

Ну, в общем, как-то так :)

В какую сторону копать?



_____________
[продано копирайтерам]
AllesKlar
Собственно говоря, алгоритм примерно такой:

по имени переменной или константы ищем ее вхождение в файл и "нормализуем строку / строки" в удобноперевариваемый вид.
Например, заменяем двойные кавычки на одинарные, если имеется значение, то удаляем его, удаляем все пробелы, табы и сиволы переноса строки. В итоге имеем нечто красивое в одну строку типа
$config['part']['subpart'] = '';


Удаляем исходное, записываем "нормализованное".

А дальше задача сводится к уже решенной :)

Замечу, проводить данную операцию над всем файлом нельзя, т.к. в файле есть проинициилизированные переменные/константы, неизвестные скрипту, и их значения должны быть сохранены.

_____________
[продано копирайтерам]
paul85
О как...
Цитата
Скрипт должен корекно прописать значение переменной при любом верном синтаксисе php.

Вот этим занимается интерпритатор PHP. Его создавать для решения подобной задачи - утопия. Поэтому правильная мысль "нормализовать" файл перед тем как вносить изменения через регулярки (в данном случае sed). В принципе решить подобную задачу можно и на PHP, но раз требуется shell - извольте.

Я бы приводил к нормальному виду с помощью примерно такого скрипта:

#!/bin/bash

cat config.php | while read x
do
if [[ "$x" == *"\$config"* ]]; then
a=1
fi

if [ "$a" == "1" ]; then
string="$string $x"
else
echo $x
fi

if [[ "$x" == *";"* ]]; then
a=0
echo $string | sed "s/\"/'/g" | sed 's/\s\+//g'
string=''
fi
done


Он убьет разметку, но работоспособность php скрипт потерять не должен... Данный сценарий shell меняет в ключах $config все двойные кавычки на одинарные. Это недопустимо, если в качестве ключа используется переменная в двойных кавычках (хоть кавычки и не нужны, но от программиста так оформляющего текст, можно ожидать чего угодно ;) )... Тут надо смотреть. Возможно не стОит менять, а просто подумать над регуляркой по замене значений. Чтобы она воспринимала и те и другие, например.

Далее применяются ваши правила по замене.

P.s. Зависит от конкретного примера, так можно гадать сколь угодно долго.
Oyeme
Я бы посоветовал Вам хранить файлы для конфугирации в других форматах.
Цитата
YAML,XML
paul85
Oyeme, каждый раз парсить XML и раскладывать в переменные? Не накладно это по ресурсам?
AllesKlar
paul85
спасибо за скрипт, сейчас покурим... smile.gif

Остальным тоже спасибо за участие, дабы дальнейшие дебаты об php и прочих xml не плодить, поясню:

Есть готовый продукт.
Исходники лежат в репозитарии, переодически группой разработчиков фиксятся баги, исходники коммитятся, выпускаются новые версии.

Дабы процесс установки/апдейта упростить, решено было написать скрипт-установщик.
По вполне понятным причинам, апачу доступа к репозитарию нет, следовательно, вариант php отпадает.
Объявить на работе: народ, теперь конфиги храним в xml, потому что так легче для установки.. нуу.. как бы неэтично по отношению к кодерам smile.gif Я бы послал smile.gif



_____________
[продано копирайтерам]
Oyeme
Цитата
Oyeme, каждый раз парсить XML и раскладывать в переменные? Не накладно это по ресурсам?

О каких ресурсах идет речь?Файлы с конфигурациями обычно занимают пару десяток строк.

Для этого и были придуманны форматы для хранения конфигураций.Чтобы Вы не выдумывали решения ,как это делает автор темы.


Цитата (AllesKlar @ 4.01.2014 - 22:07)
paul85
спасибо за скрипт, сейчас покурим... :)

Остальным тоже спасибо за участие, дабы дальнейшие дебаты об php и прочих xml не плодить, поясню:

Есть готовый продукт.
Исходники лежат в репозитарии, переодически группой разработчиков фиксятся баги, исходники коммитятся, выпускаются новые версии.

Дабы процесс установки/апдейта упростить, решено было написать скрипт-установщик.
По вполне понятным причинам, апачу доступа к репозитарию нет, следовательно, вариант php отпадает.
Объявить на работе: народ, теперь конфиги храним в xml, потому что так легче для установки.. нуу.. как бы неэтично по отношению к кодерам :) Я бы послал :)

Потому что эти форматы как раз и для того чтобы Вы хранили в них свои конфигурации.

Я бы Вам посоветовал формат YAML

http://www.yaml.org/

Какой формат Вы бы не выбрали он будет в любом случаи удобней и лучше чем parsing
$config['part']['subpart'] = '';


У Вас не верная архитектура хранения конфигураций,и не верное проектирование "обновления файлов"

Вам следует разделать commits на что можно обновлять , а что нет.
Файлы с конфигурациями должы быть добавлены в ignore list .
AllesKlar
Oyeme
Интересное решение, нужно будет поразмыслить на досуге.
Одно дело шоп на коленках, другое дело серьезный комерческий продукт, где двухкопеешная оптимизация потом выливается в экономию друдонедель отдела.

Надо с архитектором поговорить, может и внедрим smile.gif

_____________
[продано копирайтерам]
paul85
Oyeme, но его ведь нет в PHP по дефолту. YAML.
Может быть я и не прав - тогда поправь меня. Но по-моему нужно стараться использовать по-максимуму дефолтные библии, дабы облегчить жизнь админу - деплойщику.
Oyeme
Цитата (paul85 @ 5.01.2014 - 02:16)
Oyeme, но его ведь нет в PHP по дефолту. YAML.
Может быть я и не прав - тогда поправь меня. Но по-моему нужно стараться использовать по-максимуму дефолтные библии, дабы облегчить жизнь админу - деплойщику.

Есть библиотеки которые попали в список по default,а есть которые не попали.В этом то и есть разница.

В php в самом начале было всего пару библиотек,спустя года их уже десятки.

Так же и на уровне linux.При настраивания сервера с чистого листа.
Вы устанавливаете десятки разных библиотек.

Само ядро линкус состит из одинх библиотек.

В php Вы подключаете библиотеку строчкой extension=php_curl.dll
и таких библиотек сотни.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.