Здравствуйте, коллеги.
Возникла задачка на из bash скрипта распарсить конфигурационный файл и, соответственно, проинициализировать свои переменные на основе данных конфига.
Формат конфига простой ка мычание: ключ = значение. Т.е. разделителем служит знак =. Что слева от него - ключ, справа - значение.
Понимаю, что на python это сделать как 2 пальца об асфальт, но, в силу ряда причин, приходится башить.
Тем не менее, на вооружение, я взял пистоновский подход:
declare -A conf
default_conf(){
conf['user']=user
conf['passwd']=''
# ...
}
Т.е. инициализирую dictionary значениями по умолчанию, которые, в дальнейшем, будут проиницилизированы повторно, но уже данными из конфига.
Наверное мне проще задать вопрос на примере
load_conf(){
# $1 - conf file
[ -f $1 ] || return 1
local l lines var param
# Загружаем конфигурационный файл без коментариев (# ...) и
# пустых строк
IFS=$'\n'
lines=($(awk -F# '{print $1}' | grep -v '^\s*$'))
for l in ${lines[@]}; do
var=${l%%=*}
param=${l#*=}
# ...
done
}
Вот, кстати, тут и возник вопрос по «подстановкам». Инициализацию var и param я подглядел, но до конца не понял.
Если не сложно, то ткните носом где о подобном можно почитать
Дальше, по идее, нужно проверять $var на наличие такого ключа в conf, но я не знаю как это сделать.
В интернете советуют проверять наличие ключа в словаре следующим образом:
[ -n "${conf[$var]}" ] && ${conf[$var]}=$param
но это как-то не верно, на мой взгляд. Ведь в словаре может быть ключ с пустым значением, как, например, в функции default_conf инициализируется conf[‘passwwd’]='', т.е. инициализируется пустым значением по умолчанию. Тут прилетает из конфига passwd = 12345 и скрипт отбросит этот пароль, т.к. в словаре пароль инициализирован пустым значением.
Можно, конечно, пойти от обратного и сразу инициализировать словарь значениями из файла, а потом уже проверять ключи на наличие, но так в словарь могут залететь непредусмотренные ключи с дурацкими значениями, типа:
var='hernya'
param='polnaya'
conf[$var]=$param
Большой беды не будет, но, как-то не правильно, засерать словарь всякой глупостью, которую может придумать конечный юзверь.
UPD awk можно выбросить и загрузку сделать грепом:
grep -v '\s*#.*$\|^\s*$' $1