[英]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将始终正确配对和排序)。
做mysqlshortcut -e“按rand()限制1从table1的顺序选择col1,col2,col3;” db1
做mysqlshortcut -e“按rand()限制1从table2顺序选择col1,col2,col3;” db2
做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.