繁体   English   中英

在bash循环中使用2个数组从命令行查询mysql

[英]Using 2 arrays in a bash loop to query mysql from the command line

我已经阅读了许多相关文章,即使尝试了推荐的示例,也仍然无法解决。

我有2个数组:

1)包含不同数据库(db)名称的数组

echo "${ARRAY_DB[*]}"
db1 db2 db3

2)一个数组,其中包含每个数据库的关联表名

echo "${ARRAY_TABLE[*]}"
table1 table2 table3

对于每个数据库,所有表都具有相同的列名称结构。

另外,两个数组的顺序是这样的,我知道table1在db1中,而table2在db2中,依此类推。

我想循环查询mysql,并从每个db-table配对中拉出几列。

仅使用一个数组,我可以通过仅将数组用于表来成功循环。 在下面的示例中,我仅使用数据库名称“ db4”而不是数据库数组。 本质上,我想用数据库数组替换静态“ db4”。

因此,使用静态db而不是db数组,可以正常工作:

for i in "{$ARRAY_TRACK[@]}" ; do mysqlshortcut -e "select col1,col2,col3 from "$i" order by rand() limit 1 ;" db4 ; done

从概念上讲,这是我需要做的:

for i in "{$ARRAY_TRACK[@]}" ; do mysqlshortcut -e "select col1,col2,col3 from "$i" order by rand() limit 1 ;" "{$ARRAY_DB[@]}" ; done

这将导致以下一行一行地逐步增加每个数组中的下一个表和关联的db,直到数组中的所有项目完成循环为止。 现在,让我们说每个数组中有3个项目(这2个数组中的db-to-tables将始终正确配对和排序)。

  1. 做mysqlshortcut -e“按rand()限制1从table1的顺序选择col1,col2,col3;” db1

  2. 做mysqlshortcut -e“按rand()限制1从table2顺序选择col1,col2,col3;” db2

  3. 做mysqlshortcut -e“按rand()限制1从table3顺序选择col1,col2,col3;” db3

完成上述循环后,我的结果将如下所示:

           col1 col2 col3
db1.table1  x    x    x
db2.table2  y    y    y 
db3.table3  z    z    z

实际上,我可以使用两个数组进行一个简单的循环,如下所示:

for ((i=0;i<${#ARRAY_DB[@]};++i)); do printf "%s is in %s\n" "${ARRAY_TABLE[i]}" "${ARRAY_DB[i]}" ; done

效果不错:

table1 is in db1
table2 is in db2
table3 is in db3

我试图采用这种方法(上述)并将其应用于sql查询(在下面的示例中),但是它不起作用,而且我认为我没有正确构建它。 我有种感觉,就是我可能不理解引号。

for ((i=0;i<${#ARRAY_DB[@]};++i)); do mysqlshortcut -e "select col1,col2,col3 from "%s";" %s "${ARRAY_DB[i]}" "${ARRAY_TRACK[i]}" ; done

有什么建议或其他方法吗? 我是bash脚本的新手,并且是数组的新手。

非常感谢您的任何建议!

'%s'是printf指定符,请尝试使用实际的数组表达式:

mysqlshortcut -e "select col1,col2,col3 from ${ARRAY_DB[i]}; ${ARRAY_TRACK[i]}"

或使用printf:

 mysqlshortcut -e $(printf 'select col1,col2,col3 from %s; %s' "${ARRAY_DB[i]}" "${ARRAY_TRACK[i]}")

暂无
暂无

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

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