簡體   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