Boucle De Script Bash Par MySQL

j'ai besoin d'un script bash qui puisse récupérer des données MySQL à partir d'une base de données distante. En fait j'ai fait ça, mais ce que j'ai besoin de faire maintenant c'est boucler les enregistrements d'une façon ou d'une autre et passer une variable à un autre fichier bash. Voici mon appel MySQL:

mysql -X -u $MyUSER -p$MyPASS -h$MyHOST -D$MyDB -e'SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`="1" AND `theme_compiled`='0';' > themes.xml
download_themes.sh

Il exporte les données dans un fichier xml appelé à thème.en ce moment, j'essayais juste de trouver un moyen de passer en boucle les données. J'essaie d'éviter PHP et perl et juste d'utiliser bash. Merci à l'avance.

16
demandé sur Brian Leishman 2011-05-07 04:54:34

4 réponses

quelque chose comme:

mysql -e "SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`='1' AND `theme_compiled`='0'" | while read theme_name guid; do
    # use $theme_name and $guid variables
    echo "theme: $theme_name, guid: $guid"
done

en bref:mysql commande Sortie enregistrement séparé par' \n 'et champs séparés par' \t ' lorsque la sortie est un tube. read commande lit une ligne, fentes dans les champs, et met chacun sur une variable.

si vos données ont des espaces dans les champs, vous avez des problèmes avec la valeur par défaut read fractionnement. il y a plusieurs façons de l'éviter, mais si vous ne lisez que deux champs et que l'un d'eux ne devrait pas avoir d'espaces (comme le guid), alors vous pouvez mettre le "dangereux" du champ à la fin, et read mettra tout 'extra' dans la dernière variable.

comme ceci:

mysql -e "SELECT `guid` `theme_name`, FROM `themes` WHERE `theme_purchased`='1' AND `theme_compiled`='0'" | while read guid theme_name; do
    # use $theme_name and $guid variables
    echo "theme: $theme_name, guid: $guid"
done
39
répondu Javier 2011-05-07 12:27:04

la réponse acceptée ne fonctionne pas lorsque les espaces sont dans la sortie. C'est une solution facile (IFS=$'\t' -- Note $ -- c'est bizarre):


>mysql ... -BNr -e "SELECT 'funny man', 'wonderful' UNION SELECT 'no_space', 'I love spaces';" | while IFS=$'\t' read theme_name guid; do echo "theme: $theme_name guid: $guid"; done
theme: funny man guid: wonderful
theme: no_space guid: I love spaces

vous voudrez bien sûr substituer votre propre requête.

4
répondu CSTobey 2015-09-01 18:27:58

plutôt que d'extraire du XML, puis-je vous suggérer d'utiliser simplement le SELECT INTO OUTFILE syntaxe ou mysql --batch --raw pour la sortie des valeurs délimitées par des tabulations. Vous avez alors un accès beaucoup plus facile via bash au reste de la chaîne Unix, comme cut et awk pour récupérer les champs dont vous avez besoin et les réutiliser avec Bash. Aucun autre langage de script n'est nécessaire et vous n'avez pas besoin de jouer avec XML.

mysql --batch --raw -u $MyUSER -p$MyPASS -h$MyHOST -D$MyDB -e'SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`="1" AND `theme_compiled`='0';' \
| awk '{print "theme: "   " guid: " }'
3
répondu Michael Berkowski 2011-05-07 01:10:59

Pipe'|', tout est dangereux, pour les modifications à l'intérieur de la boucle se produire dans un autre sous-processus et de ne pas les prendre effet dans le script courant.

au fait, je déteste me tourner vers la solution du fichier externe.

je suggère d'utiliser " Procédé De Substitution".

while read field1 field2 field3
do
done < <(mysql -NB -e "$sql")
#     ^
#   space needed
1
répondu Jan Fan 2015-09-09 07:24:54