J'essaie d'écrire un script qui configure mySQL. Disons que je veux configurer le port sur 3333, donc je veux que le fichier de configuration contienne les lignes
[mysqld]
port=3333
[client]
port=3333
Au début, j'étais simplement echo
ing les nouvelles lignes:
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
Mais ensuite, j'ai réalisé que le fichier de configuration contiendrait toutes les entrées plusieurs fois au cas où je l'exécuterais plusieurs fois. J'ai donc appliqué une vérification à l'aide d'une fonction:
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
Cette fonction n’ajoutera la ligne que si elle n’existe pas encore.
Malheureusement, lors de la configuration de port=3333
dans la section [mysqld]
, il détecte que port=3333
est déjà présent (mais dans [client]
).
Comment pourrais-je écrire des fichiers de configuration comme celui de mySQL dans un script Bash Linux?
Fondamentalement, je cherche quelque chose comme
setconfigvalue <section> <value> <file>
pour que je puisse écrire
setconfigvalue [mysqld] port=3333 /etc/mysql/my.cnf
J'ai essayé les suggestions de cette question du site soeur de U & L "Éditer INI comme des fichiers avec un script" .
La réponse acceptée ne fournit que des solutions codées en dur pour le problème du PO. J'aurais besoin de les adapter, mais c'est sujet aux erreurs.
J'ai essayé crudini
, qui semble être le bon outil de par sa syntaxe. Mais il ne peut pas analyser les fichiers de configuration mySQL à cause des includes:
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/
Il s'est avéré que j'ai la version 0.7-1 de crudini
installée à partir des packages officiels. Il existe une version plus récente disponible sur Github , 0.9 au moment de la rédaction.
J'ai remplacé l'ancienne version par la nouvelle version en utilisant wget
:
wget -q https://raw.githubusercontent.com/pixelb/crudini/master/crudini -O /usr/bin/crudini
Ainsi, le message d'erreur relatif à l'erreur d'analyse a disparu:
crudini --get /etc/mysql/my.cnf mysqld port
Parameter not found: port
Et j'ai pu définir les paramètres que je voulais:
crudini --set /etc/mysql/my.cnf mysqld port 3333
crudini --get /etc/mysql/my.cnf mysqld port
3333