我已经审核了很多相关帖子,即使在尝试了推荐的示例后,我仍然卡住了。
我有2个阵列:
1)包含不同数据库(db)名称的数组
echo "${ARRAY_DB[*]}"
db1 db2 db3
2)一个数组,它包含每个数据库的相关表名
echo "${ARRAY_TABLE[*]}"
table1 table2 table3
对于每个db,所有表都具有相同的列名结构。
另外,两个数组是按顺序排列的,我知道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
将逐行导致以下内容逐步添加下一个表和每个数组中的关联数据库,直到数组中的总项完成循环。现在让我们说每个数组中有3个项目(这两个数组中的db-to-tables将始终配对并正确排序)。
执行mysqlshortcut -e"从rand()限制1中选择table1的col1,col2,col3;" DB1
执行mysqlshortcut -e"从rand()limit 1中选择table2中的col1,col2,col3;" DB2
执行mysqlshortcut -e"从rand()限制1中选择表3中的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查询(在下面的示例中),但它不起作用,我不认为我&#39;我正确地构建了它。我有一种感觉,我可能不理解引号,等等。
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脚本的新手,对数组来说是全新的。
非常感谢任何建议!
答案 0 :(得分:0)
&#39;%S&#39;是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]}")