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.
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
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.
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: " }'
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