web-dev-qa-db-ja.com

構成ファイルのエントリを特定のセクションに追加する

MySQLを構成するスクリプトを作成しようとしています。ポートを3333に設定したいので、設定ファイルに次の行を含めたいとします

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

最初は、単に新しい行をechoingしていました:

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のようなファイルを編集する」 からの提案を試しました。

受け入れられた答えは、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/
2
Thomas Weller

公式パッケージからcrudiniのバージョン0.7-1がインストールされていることがわかりました。新しいバージョンがあります 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
Thomas Weller