我正在嘗試使用一個查詢在 bash 陣列中保存多列,但我無法弄清楚。現在我有 3 個這樣的選擇:
read -d \t -ra data1<<< $(mysql -u root -p'password' -D'users_info' -se 'SELECT data1 FROM users_logs')
read -d \t -ra data2<<< $(mysql -u root -p'password' -D'users_info' -se 'SELECT data2 FROM users_logs')
read -d \t -ra data3<<< $(mysql -u root -p'password' -D'users_info' -se 'SELECT data3 FROM users_logs')
它正在作業,但我想知道這是否是最佳方式。我認為我可以通過一個查詢來實作這一點。我試圖用mysql --batchand做點什么mapfile,但做不到。
和運行的輸出:
mysql -u root -p'password' -D'users_info' -se 'SELECT data1, data2, data3 FROM users_logs'
是:
[email protected] 2 2z7bhxb55d3
[email protected] 2 we3cq3micu9cn
[email protected] 1 we3cq1dicu9cn
所有這些資料都是 varchar(30)。
uj5u.com熱心網友回復:
假設目標是將資料網格讀取到多個陣列中(每列加載到一個單獨的陣列中)......
對于使用動態生成/填充陣列,bash namerefs請查看此答案。
如果陣列的數量(及其名稱)是預定義的...
首先是一些資料來模擬 OP 的輸出:
$ cat mysql.out
somemail1@gmail.com 2 2z7bhxb55d3
somemail2@gmail.com 2 we3cq3micu9cn
somemail3@gmail.com 1 we3cq1dicu9cn
注意:以下代碼假設列資料不包含空格,例如,上面的檔案有 3 列而不是 1 列帶有嵌入空格;否則 OP 將需要確保輸入流具有可被while回圈使用的明確定義的列分隔符
一個bash回圈的想法:
unset data1 data2 data3
typeset -a data1 data2 data3
i=0
while read -r col1 col2 col3
do
(( i ))
data1[${i}]="${col1}"
data2[${i}]="${col2}"
data3[${i}]="${col3}"
done < mysql.out # replace this with ...
# done < <(mysql ... SELECT data1,data2,data3 ...) # this to have mysql results fed directly into 'while' loop
這給了我們:
$ typeset -p data1 data2 data3
declare -a data1=([1]="[email protected]" [2]="[email protected]" [3]="[email protected]")
declare -a data2=([1]="2" [2]="2" [3]="1")
declare -a data3=([1]="2z7bhxb55d3" [2]="we3cq3micu9cn" [3]="we3cq1dicu9cn")
如果您不介意從@ 0 開始的索引...
unset data1 data2 data3
typeset -a data1 data2 data3
while read -r col1 col2 col3
do
data1 =("${col1}")
data2 =("${col2}")
data3 =("${col3}")
done < mysql.out
這給了我們:
$ typeset -p data1 data2 data3
declare -a data1=([0]="[email protected]" [1]="[email protected]" [2]="[email protected]")
declare -a data2=([0]="2" [1]="2" [2]="1")
declare -a data3=([0]="2z7bhxb55d3" [1]="we3cq3micu9cn" [2]="we3cq1dicu9cn")
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351106.html
