URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 94392
[ Назад ]

Исходное сообщение
"bash: чтение конфига из файлов"

Отправлено stakado , 20-Фев-13 10:18 
Здравствуйте!
Есть директория, в ней лежат файлы , примерно следующего содержания:

файл admin.wb:
login=stakado
pass=zzzzz
dir=d$/BackupTest
dir=d$/Test2

Подскажите, пожалуйста, каким образом данные из этих файлов перегнать в bash-переменные, чтобы их в дальнейшем можно было удобно использовать.
Мне представляется некий объект, у которого есть атрибуты - login, pass и сколько угодно много атрибутов dir, но вот как этот объект реализовать не представляется.

Подскажите, пожалуйста, каким образом это реализовать в скрипте на bash'e?


Содержание

Сообщения в этом обсуждении
"bash: чтение конфига из файлов"
Отправлено orangeant , 20-Фев-13 11:14 
Использовать source aka dot command в скрипте, который будет использовать переменные определенные в другом файле.


"bash: чтение конфига из файлов"
Отправлено stakado , 20-Фев-13 11:41 
> Использовать source aka dot command в скрипте, который будет использовать переменные определенные
> в другом файле.

команда source выполнит указанный мною файл. Если в файле разместить переменные (по сути команды bash), то эти переменные и присвоят себе указанные значения. Т.е. таким образом задание переменных (в формате bash: переменная=значение) лишь выносится в отдельный файл. Эт ясно, спасибо.
Но что же делать с параметрами, у которых одинаковые названия? В указанном выше примере - такие переменные dir. После выполнения моего конфига с помощью команды source я увижу лишь последнее значение переменной, а мне нужны все, которые указаны в конфиге.
Можно предложить вариант задавать в конфиге эти переменные как массив (dir[0]=value0,dir[1]=value1), но мне такой вариант не нравится.
Ладно, дальше больше. У меня таких файлов много, если они все по-очереди выполнятся, то я увижу переменные лишь из последнего конфига, мне же нужны значения из всех конфигов.

После написания первого поста возник вопрос: можно ли каким-нибудь образом в bash'e создать объект с заданным набором атрибутов? Ну а дальше использовать массив этих объектов...


"bash: чтение конфига из файлов"
Отправлено fantom , 20-Фев-13 12:05 
>[оверквотинг удален]
> помощью команды source я увижу лишь последнее значение переменной, а мне
> нужны все, которые указаны в конфиге.
> Можно предложить вариант задавать в конфиге эти переменные как массив (dir[0]=value0,dir[1]=value1),
> но мне такой вариант не нравится.
> Ладно, дальше больше. У меня таких файлов много, если они все по-очереди
> выполнятся, то я увижу переменные лишь из последнего конфига, мне же
> нужны значения из всех конфигов.
> После написания первого поста возник вопрос: можно ли каким-нибудь образом в bash'e
> создать объект с заданным набором атрибутов? Ну а дальше использовать массив
> этих объектов...

для bash это не объект, а переменная, перестаньте думать обьектами, думайте переменными...

Как с вашей точки зрения bash будет распознавать
Х=1
Х=Н-1
когда вам нужно изменить значение переменной, а когда - дописать элемент массива?

в подавляющем большинстве конфигов ваш вопрос решается довольно просто,
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

т.е. PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

Надо вам чтобы была куча значений -> пишите обработчик, на входе ему даете ваш файлик, если переменной еще нет - он ее тупо создает и присваевает значение, если такая уже есть - дописывает через то же ":" еще один "объект" в вашу переменную


"bash: чтение конфига из файлов"
Отправлено stakado , 20-Фев-13 12:30 
>[оверквотинг удален]
> Х=Н-1
> когда вам нужно изменить значение переменной, а когда - дописать элемент массива?
> в подавляющем большинстве конфигов ваш вопрос решается довольно просто,
> echo $PATH
> /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
> т.е. PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
> Надо вам чтобы была куча значений -> пишите обработчик, на входе ему
> даете ваш файлик, если переменной еще нет - он ее тупо
> создает и присваевает значение, если такая уже есть - дописывает через
> то же ":" еще один "объект" в вашу переменную

Так-с, ладно. В каждом конфиге я завожу 1 параметр dir, в котором указаны все значения переменной через :.
Далее, если я инициализирую все конфиги с помощью source - я увижу значения переменных лишь из последнего файла, что не есть верно.
Более того, мне не очень понятно как в дальнейшем разделять значения из переменной dir. Писать обработчик, который будет искать в строке : и отделять таким образом значения? Корявым мне видится такой вариант.


"bash: чтение конфига из файлов"
Отправлено fantom , 20-Фев-13 13:53 
>[оверквотинг удален]
>> даете ваш файлик, если переменной еще нет - он ее тупо
>> создает и присваевает значение, если такая уже есть - дописывает через
>> то же ":" еще один "объект" в вашу переменную
> Так-с, ладно. В каждом конфиге я завожу 1 параметр dir, в котором
> указаны все значения переменной через :.
> Далее, если я инициализирую все конфиги с помощью source - я увижу
> значения переменных лишь из последнего файла, что не есть верно.
> Более того, мне не очень понятно как в дальнейшем разделять значения из
> переменной dir. Писать обработчик, который будет искать в строке : и
> отделять таким образом значения? Корявым мне видится такой вариант.

Однако похоже именно он спользуется



"bash: чтение конфига из файлов"
Отправлено LSTemp , 21-Фев-13 09:40 
>[оверквотинг удален]
>> даете ваш файлик, если переменной еще нет - он ее тупо
>> создает и присваевает значение, если такая уже есть - дописывает через
>> то же ":" еще один "объект" в вашу переменную
> Так-с, ладно. В каждом конфиге я завожу 1 параметр dir, в котором
> указаны все значения переменной через :.
> Далее, если я инициализирую все конфиги с помощью source - я увижу
> значения переменных лишь из последнего файла, что не есть верно.
> Более того, мне не очень понятно как в дальнейшем разделять значения из
> переменной dir. Писать обработчик, который будет искать в строке : и
> отделять таким образом значения? Корявым мне видится такой вариант.

man bash:
subshell
циклы
переменные



"bash: чтение конфига из файлов"
Отправлено fantom , 21-Фев-13 11:31 
>[оверквотинг удален]
>> указаны все значения переменной через :.
>> Далее, если я инициализирую все конфиги с помощью source - я увижу
>> значения переменных лишь из последнего файла, что не есть верно.
>> Более того, мне не очень понятно как в дальнейшем разделять значения из
>> переменной dir. Писать обработчик, который будет искать в строке : и
>> отделять таким образом значения? Корявым мне видится такой вариант.
> man bash:
> subshell
> циклы
> переменные

Как все это загнать в одну переменную способ простой:
вместо

dir=<значение>

пишите
dir="${dir}<значение><разделитель>"

если значения в dir НЕ допускают пробелов - все еще проще

dir="${dir}<значение> " (пробел в конце нужен)

разбить сие на составные части если разделитель - пробел

for TEST in ${dir}
do
<что делаем? например формируем массив array_dir[0], array_dir[1] и т.д.>
done

Так что меняете вид конфига и значения будут не переписываться, а дописываться.


"bash: чтение конфига из файлов"
Отправлено stakado , 22-Фев-13 08:51 
>[оверквотинг удален]
> пишите
> dir="${dir}<значение><разделитель>"
> если значения в dir НЕ допускают пробелов - все еще проще
> dir="${dir}<значение> " (пробел в конце нужен)
> разбить сие на составные части если разделитель - пробел
> for TEST in ${dir}
> do
> <что делаем? например формируем массив array_dir[0], array_dir[1] и т.д.>
> done
> Так что меняете вид конфига и значения будут не переписываться, а дописываться.

Где ж Вы раньше были, я уже своих костылей понапридумывал. Ваш способ так-то поэлегантнее будет.


"bash: чтение конфига из файлов"
Отправлено fantom , 22-Фев-13 12:10 
>[оверквотинг удален]
>> если значения в dir НЕ допускают пробелов - все еще проще
>> dir="${dir}<значение> " (пробел в конце нужен)
>> разбить сие на составные части если разделитель - пробел
>> for TEST in ${dir}
>> do
>> <что делаем? например формируем массив array_dir[0], array_dir[1] и т.д.>
>> done
>> Так что меняете вид конфига и значения будут не переписываться, а дописываться.
> Где ж Вы раньше были, я уже своих костылей понапридумывал. Ваш способ
> так-то поэлегантнее будет.

Жаль запатентовать не получиться :)
Способ не мой - он в куче sell-овских скриптов используется ;)


"bash: чтение конфига из файлов"
Отправлено LSTemp , 23-Фев-13 08:10 
> Жаль запатентовать не получиться :)
> Способ не мой - он в куче sell-овских скриптов используется ;)

присвоение значения переменной запатентовать вряд ли удастся :)



"bash: чтение конфига из файлов"
Отправлено McLeod095 , 22-Фев-13 15:32 
>[оверквотинг удален]
>> если значения в dir НЕ допускают пробелов - все еще проще
>> dir="${dir}<значение> " (пробел в конце нужен)
>> разбить сие на составные части если разделитель - пробел
>> for TEST in ${dir}
>> do
>> <что делаем? например формируем массив array_dir[0], array_dir[1] и т.д.>
>> done
>> Так что меняете вид конфига и значения будут не переписываться, а дописываться.
> Где ж Вы раньше были, я уже своих костылей понапридумывал. Ваш способ
> так-то поэлегантнее будет.

ну можно еще вот так скормить файл


echo -e "dir=1\ndir=2\ndir=45\n" | sed 's/dir=//' |sed -e :a -e '/$/N; s/\n/:/; ta'
1:2:45:

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

и запихнуть вывод в переменную.
grep "dir=" file | sed 's/dir=//' |sed -e :a -e '/$/N; s/\n/:/; ta'


"bash: чтение конфига из файлов"
Отправлено LSTemp , 23-Фев-13 07:39 
>[оверквотинг удален]
>> если значения в dir НЕ допускают пробелов - все еще проще
>> dir="${dir}<значение> " (пробел в конце нужен)
>> разбить сие на составные части если разделитель - пробел
>> for TEST in ${dir}
>> do
>> <что делаем? например формируем массив array_dir[0], array_dir[1] и т.д.>
>> done
>> Так что меняете вид конфига и значения будут не переписываться, а дописываться.
> Где ж Вы раньше были, я уже своих костылей понапридумывал. Ваш способ
> так-то поэлегантнее будет.

Вам же сказали: читать про переменные циклы и сабшелы. Или потом на каждый чих в своем скрипте будете отдельную тему заводить? Не лучше ли сразу оболочку командной строки изучить, с которой работаете?