Bash脚本循环通过MySQL

Bri*_*ica 16 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
Run Code Online (Sandbox Code Playgroud)

它现在将数据导出到一个名为theme.xml的xml文件中,我只想弄清楚循环数据的方法.我试图避免PHP和perl,只是尝试使用bash.提前致谢.

Jav*_*ier 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
Run Code Online (Sandbox Code Playgroud)

简而言之:mysql当输出是管道时,命令输出由'\n'分隔的记录和由'\ t'分隔的字段.该read命令读取一行,在字段中拆分,并将每个放在一个变量上.

如果您的数据在字段中有空格,则会出现一些默认read拆分问题.有一些方法可以解决它; 但如果你只是阅读两个字段而其中一个字段不应该有任何空格(比如guid),那么你可以将'dangerous'字段放在最后,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
Run Code Online (Sandbox Code Playgroud)


Mic*_*ski 6

我建议您只使用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}'
Run Code Online (Sandbox Code Playgroud)


CST*_*bey 5

当输出中有空格时,接受的答案不起作用。这是一个简单的解决方法(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
Run Code Online (Sandbox Code Playgroud)

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