Я пытаюсь написать скрипт, который настраивает 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/
Оказалось, что у меня установлена версия 0.7-1 из crudini
из официальных пакетов. Существует более новая версия , доступная на Github , 0,9 на момент написания.
Я заменил старую версию новой версией, используя wget
:
wget -q https://raw.githubusercontent.com/pixelb/crudini/master/crudini -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