Bash脚本循环通过MySQL

时间:2011-05-07 00:54:34

标签: mysql bash loops

我需要一个可以从远程数据库中检索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。提前谢谢。

4 个答案:

答案 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工具链的其余部分,例如cutawk,以检索您需要的字段并将其重用于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