如何在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单元素数组中,标量变量的行为相同.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...