Добавление записей файла конфигурации в определенные разделы

Я пытаюсь написать скрипт, который настраивает mySQL. Допустим, я хочу настроить порт на 3333, поэтому я хочу, чтобы файл конфигурации содержал строки

[mysqld]
port=3333
[client]
port=3333

Сначала я просто echo вводил новые строки:

echo "[mysqld]" >> /etc/mysql/my.cnf
echo "port=3333" >> /etc/mysql/my.cnf
echo "[client]" >> /etc/mysql/my.cnf
echo "port=3333" >> /etc/mysql/my.cnf

Но потом я понял, что файл конфигурации будет содержать все записи несколько раз, если я буду запускать его несколько раз. Поэтому я применил проверку с помощью функции:

function appendconfig {
    grep -qF "$1" "$2" || echo "$1" >> "$2"
}
cfg=/etc/mysql/my.cnf
appendconfig "[client]" $cfg
appendconfig "port=3333" $cfg
appendconfig "[mysqld]" $cfg
appendconfig "port=3333" $cfg

Эта функция добавит строку, только если она еще не существует.

К сожалению, при настройке port=3333 в разделе [mysqld] он обнаруживает, что port=3333 уже присутствует (но в [client]).

Каким образом я напишу файлы конфигурации, такие как mySQL, в скрипте Linux Bash?

В основном я ищу что-то вроде

setconfigvalue <section> <value> <file>

, чтобы я мог написать

]
setconfigvalue [mysqld] port=3333 /etc/mysql/my.cnf

Я попробовал предложения из этого родственного вопроса сайта U & amp; L "Редактирование INI-подобных файлов с помощью скрипта" .

Принятый ответ просто предоставляет решения, которые жестко запрограммированы для проблемы ОП. Мне нужно адаптировать их, но это может привести к ошибкам.

Я попытался crudini, который, кажется, является правильным инструментом из его синтаксиса. Но он не может анализировать конфигурационные файлы mySQL из-за включений:

crudini --get /etc/mysql/my.cnf client port
File contains parsing errors: <???>
    [line 22]: !includedir /etc/mysql/conf.d/
    [line 23]: !includedir /etc/mysql/mariadb.conf.d/
2
задан 14 January 2018 в 02:57

1 ответ

Оказалось, что у меня установлена ​​версия 0.7-1 из crudini из официальных пакетов. Существует более новая версия , доступная на Github , 0,9 на момент написания.

Я заменил старую версию новой версией, используя wget:

wget -q https://raw.githubusercontent.com/pixelb/crudini/master/crud‌​ini -O /usr/bin/crudini

Таким образом, сообщение об ошибке разбора исчезло:

crudini --get /etc/mysql/my.cnf mysqld port
Parameter not found: port

чтобы установить параметры, которые я хотел:

crudini --set /etc/mysql/my.cnf mysqld port 3333
crudini --get /etc/mysql/my.cnf mysqld port
3333
3
ответ дан 14 January 2018 в 02:57

Другие вопросы по тегам:

Похожие вопросы: