The Fluidstance Slope m'a rappelé que d'écrire des trucs sur des rochers – Review Geek
29 août 2020
Comment activer "Toujours sur le dessus" pour le Gestionnaire des tâches de Windows 10
29 août 2020

Faire en sorte que les scripts bash s'exécutent différemment en fonction du contenu d'une base de données MySQL en s'y connectant à partir de la ligne de commande et en passant une requête.

Vous pouvez faire exécuter vos scripts bash différemment en fonction du contenu d'une base de données MySQL en vous y connectant à partir de la ligne de commande et en passant une requête, que vous pouvez utiliser dans si blocs à créer des branches en fonction d'une valeur.

Remarque: Nos exemples montrent l'utilisation de l'utilisateur root sur MySQL, mais vous voudrez y substituer un autre compte d'utilisateur.

Exécuter des requêtes SQL à partir d'un script Bash

La syntaxe pour s'exécuter dans un script bash est la même que pour accéder à une base de données à partir de la ligne de commande:

mysql -u root -pPassword -h nom d'hôte -D nom de base de données -e 'query'

Si votre base de données s'exécute localement, vous pouvez omettre -h drapeau. Si vous exécutez une base de données de développement, vous pouvez omettre le -p indicateur si votre base de données n'a pas de mot de passe.

Cela affichera les résultats de la requête vers STDOUT, que vous pouvez diriger vers un fichier:

mysql -u root -D nombase -e 'SELECT * FROM table'> fichier

… Ou stocker dans une variable avec le $ () construction:

variable = $ (mysql -u root -D nombase -e 'SELECT * FROM table')

Mais le résultat ne sera pas très joli par défaut, vous pouvez donc le rendre plus facile à travailler en utilisant le -B drapeau pour imprimer au format TSV (Tab Separated Values) et le -N indicateur pour omettre les en-têtes de colonne.

Utilisez l'indicateur -B pour imprimer au format TSV (Tab Separated Values) et l'indicateur -N pour omettre les en-têtes de colonne.

Les fichiers TSV sont le cousin le moins utilisé des fichiers CSV, que vous pouvez convertir à partir de la ligne de commande.

Vérification d'une valeur spécifique et d'un branchement

Si vous souhaitez créer une branche en fonction d'une valeur de votre base de données, vous pouvez rechercher la ligne et la colonne spécifiques et stocker la réponse dans une variable. Vous pouvez ensuite utiliser un frapper si bloquer pour créer une branche en fonction du contenu de cette variable.

field = $ (mysql -u root -BNe 'USE test; SELECT label FROM test WHERE id = 1')

if ($ field == 'TEST'); puis
    //faire des trucs
Fi

Cela ne fonctionne que lorsque vous demandez une valeur spécifique et effectuez une simple comparaison. Si vous avez besoin de plus de manipulation que ce que fournit bash, vous pouvez utiliser awk, qui peut sélectionner des colonnes individuelles dans le texte et effectuer des comparaisons:

if ($ (echo $ field | awk '{if ($ 1 == valeur && $ 2 == valeur2) print 1; else print 0}') == "1"); puis
    //faire des trucs
Fi

Ici le awk La commande affiche vrai ou faux (1 ou 0), que le bash si peut utiliser pour comparer et créer une branche.

Ces deux exemples supposent que votre requête SQL ne renvoie qu'une seule ligne, ce que vous pouvez garantir en sélectionnant en fonction de l'ID. Mais si vous exécutez une requête plus complexe, vous souhaiterez peut-être limiter la réponse à la première ligne avec la commande SQL LIMITE 1.

Vérification des erreurs: vérifier si une base de données ou une table existe

Bien que vous écriviez probablement ce script spécifiquement pour votre serveur, un peu de vérification des erreurs n'a jamais fait de mal à personne. Vous voudrez vérifier que la base de données et les tables avec lesquelles vous travaillerez existent réellement avant de les manipuler. De plus, si la connexion à la base de données ne fonctionne pas, cela entraînera également une erreur.

La commande SQL 'UTILISER nombase' produira une erreur si nom de base de données n'existe pas (code retour> 0). Vous pouvez l'utiliser dans un si bloquer pour vérifier si la base de données est correctement configurée:

si mysql -u root -e 'USE mydbname'; puis
  
    // la base de données existe, faites des choses

Fi

Vous pouvez inverser le si bloquer en commençant le booléen avec un !, qui exécutera le code uniquement lorsque la base de données n'est pas configurée, ce qui est utile pour la première configuration.

De même, vous pouvez vérifier si des tables existent en essayant d'accéder à la première ligne:

si mysql -u root -e 'USE mydbname; SELECT * FROM nomtable LIMIT 1 '; puis

   // la base de données et la table existent, faites plus de choses

Fi

Parce que le si block vérifie le code de retour de la commande que vous y insérez, et les commandes MySQL renverront un code d'erreur si elles rencontrent des problèmes, vous pouvez utiliser n'importe quelle commande dans un si bloquer pour tenir compte des erreurs.

//]]>