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