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

时间:2017-11-29 05:14:03

标签: arrays bash

我已经审核了很多相关帖子,即使在尝试了推荐的示例后,我仍然卡住了。

我有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将始终配对并正确排序)。

  1. 执行mysqlshortcut -e"从rand()限制1中选择table1的col1,col2,col3;" DB1

  2. 执行mysqlshortcut -e"从rand()limit 1中选择table2中的col1,col2,col3;" DB2

  3. 执行mysqlshortcut -e"从rand()限制1中选择表3中的col1,col2,col3;" DB3

  4. 完成上面的循环后,我的结果将是这样的:

               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脚本的新手,对数组来说是全新的。

    非常感谢任何建议!

1 个答案:

答案 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]}")