2012-12-12 86 views
14

我的腳本需要一個結構來存儲查詢結果:商店查詢在陣列中的bash

#!/bin/bash 
user="..." 
psw="..." 
database="..." 
query="select name, mail from t" 
customStructure=$(mysql -u$user -p$psw $database -e "$query";) 

我不知道怎麼的{名稱,郵件}數組從查詢結果存儲..

我需要的結構是這樣的:

array=[ [name1,mail1] , [name2,mail2], ....., [nameN, mailN] ] 

有沒有辦法在bash做到這一點?

+0

爲什麼bash?你可以使用其他語言如php,python,ruby來完成同樣的工作,而且可能更容易 – ajreal

回答

16

擊陣列被初始化像這樣:

myarray=("hi" 1 "2"); 

要捕獲命令的輸出的各個部分成陣列,我們必須遍歷輸出,將其添加的結果到陣列。這是可以做到像這樣:

for i in `echo "1 2 3 4"` 
do 
    myarray+=($i) 
done 

在您的例子,它看起來像你希望得到一個MySQL命令的輸出和存儲部件的它的輸出線成子陣列。我將向您展示如何將線條捕捉到數組中,並且給出這一點,您應該能夠弄清楚如何將子數組放入它自己。

while read line 
do 
    myarray+=("$line") 
done < <(mysql -u${user} -p${psw} ${database} -e "${query}") 

另外值得一提的是,對於這種操作MySQL的,在這裏你不需要輸出元數據(如漂亮的格式化和表名),你可以使用MySQL的-B選擇做「批量產出」。

+0

我儘快嘗試,我給你反饋,謝謝! –

+0

好玩!非常感謝! –

+2

沒問題,我真的很高興我能幫上忙!如果您想自行了解更多關於Bash數組的信息,請查看以下示例:http://tldp.org/LDP/abs/html/arrays.html –

2

可以通過read -a命令訪問字段級別記錄,並且IFS設置爲空字符串,以防止讀取從行中剝離前導和尾隨空白。

#!/bin/bash 
user="..." 
psw="..." 
database="..." 
query="select name, mail from t" 

OIFS="$IFS" ; IFS=$'\n' ; oset="$-" ; set -f 

while IFS="$OIFS" read -a line 
do 
    echo ${line[0]} 
    echo ${line[1]} 
done < <(mysql -u${user} -p${psw} ${database} -e "${query}") 
+0

對於返回值中的空格不起作用,因爲它們將通過讀-a分成單獨的數組項。 – Jeroen

+0

另外第一行將是列名。不是最乾淨的,但更好的是添加:| sed的##_#g'| sed 1d – Jeroen