Я пытаюсь написать скрипт, который настраивает 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-файлов со сценарием».
В принятом ответе содержатся только решения, жестко закодированные для проблемы OP. Мне нужно было бы их адаптировать, но это ошибка.
Я попробовал 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, установленная из официальных пакетов. На момент написания этой статьи появилась более новая версия.
Я заменил старую версию новой версией, используя 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
Оказалось, что у меня есть версия 0.7-1 из crudini, установленная из официальных пакетов. На момент написания этой статьи появилась более новая версия.
Я заменил старую версию новой версией, используя 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
Оказалось, что у меня есть версия 0.7-1 из crudini, установленная из официальных пакетов. На момент написания этой статьи появилась более новая версия.
Я заменил старую версию новой версией, используя 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