繁体   English   中英

Bash脚本循环通过MySQL

[英]Bash Script Loop Through MySQL

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

就像是:

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 ),那么你可以将'dangerous'字段放在最后, read会把所有''extra'放在最后一个变量中。

像这样:

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

我建议您只使用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}'

当输出中有空格时,接受的答案不起作用。 这是一个简单的修复(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

当然,您将要替换自己的查询。

管'|' to while是危险的,因为循环内部的更改发生在另一个子进程中,并且不会在当前脚本中生效。

顺便说一句,我讨厌转向外部文件解决方案。

我建议使用“ Process Substitute ”。

while read field1 field2 field3
do
done < <(mysql -NB -e "$sql")
#     ^
#   space needed

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM