将配置文件条目添加到特定部分

将配置文件条目添加到特定部分

我正在尝试编写一个配置 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])。

我该如何用 Linux Bash 脚本编写类似 mySQL 的配置文件?

基本上我正在寻找类似的东西

setconfigvalue <section> <value> <file>

所以我可以写

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

我已经尝试过这个 U&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/

答案1

事实证明我有 0.7-1 版本的crudini installed from the official packages. There's a newer version 可在 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

相关内容