我需要一个可以从远程数据库中检索MySQL数据的bash脚本。实际上我已经完成了,但我现在需要做的是以某种方式遍历记录并将变量传递给另一个bash文件。 这是我的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
它现在将数据导出到名为theme.xml的xml文件中,我只是试图找出循环数据的方法。我试图避免PHP和perl,只是尝试使用bash。提前谢谢。
答案 0 :(得分:42)
类似的东西:
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
简而言之:当输出是管道时,mysql
命令输出由'\ n'分隔的记录和由'\ t'分隔的字段。 read
命令读取一行,在字段中拆分,并将每个放在一个变量上。
如果您的数据在字段中有空格,则会出现默认read
拆分的问题。有一些方法可以解决它;但是如果你只是阅读两个字段而其中一个字段不应该有任何空格(比如guid
),那么你可以将“危险”字段放在最后,read
将放置最后一个变量中的所有“额外”。
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
答案 1 :(得分:5)
我建议您只使用SELECT INTO OUTFILE
语法或mysql --batch --raw
输出制表符分隔值,而不是输出XML。然后,您可以通过bash更轻松地访问Unix工具链的其余部分,例如cut
和awk
,以检索您需要的字段并将其重用于Bash。没有其他脚本语言是必需的,您不需要乱用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: " $1 " guid: " $2}'
答案 2 :(得分:4)
当输出中有空格时,接受的答案不起作用。这是一个简单的修复(IFS = $'\ t' - 请注意$ - 这很奇怪):
>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
当然,您会想要替换自己的查询。
答案 3 :(得分:1)
管道'|' to while is dangerous,因为循环内部的更改发生在另一个子进程中,并且不会在当前脚本中生效。
顺便说一句,我讨厌转向外部文件解决方案。
我建议使用“Process Substitute”。
ScrollView