微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在bash数组中捕获MySQL结果集?

我在CentOS 7上使用bash shell.我想从shell脚本运行MySQL查询并迭代每行结果.如果返回了4行,我想我可以捕获数组中的四行,如下所示:

query="select p.id, p.ebook_id, es.id FROM ...";
echo "$query" > /tmp/query.sql
MysqL -u user --password=pass db_id < /tmp/query.sql > /tmp/query.csv

linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`
arraylength=${#linesIN[@]}
echo $arraylength

但是,$arraylength总是输出1,即使我可以看到返回多个结果行.如何修改上面的内容以正确创建结果数组,其中数组中的每个元素代表结果集中的一行?

解决方法:

使用--batch option,MysqL应该在一行上输出一条记录的结果,并用制表符分隔列.您可以使用Bash’s mapfile读取数组的行和进程替换,或命令替换和数组赋值:

mapfile results  < <( MysqL --batch ... < query.sql )

要么

set -f        # disable globbing
IFS=$'\n'     # set field separator to NL (only)
results=( $(MysqL --batch ... ) )

(注意IFS在此之后保持修改并且全局禁用.)

然后,如果要将行的列拆分为某些变量:

IFS=$'\t' read -r col1 col2 col2 ... <<< "${results[0]}"

你的任务

linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`

不是array assignment(它缺少括号).它只是将命令替换的输出分配给常规字符串变量. (任何换行都将嵌入那里,但它仍然只是一个字符串.)${#linesIN [@]}仍然有效,因为在Bash / ksh单元素数组中,标量变量的行为相同.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐