2012-12-12 31 views
14

Kịch bản của tôi cần phải lưu trữ trong một cấu trúc kết quả của một truy vấn:cửa hàng truy vấn trong mảng trong bash

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

Tôi không biết cách lưu trữ các mảng của {name, mail} từ kết quả truy vấn ..

tôi cần cấu trúc như thế này:

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

có cách nào để làm điều này trong bash?

+0

tại sao bash? u có thể sử dụng ngôn ngữ khác như php, python, ruby ​​để làm cùng một công việc, và có lẽ là dễ dàng hơn nhiều – ajreal

Trả lời

16

mảng Bash được khởi tạo như sau:

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

Để nắm bắt các phần riêng lẻ của sản phẩm của một lệnh vào một mảng, chúng ta phải lặp qua các đầu ra, thêm kết quả của nó để mảng. Điều đó có thể được thực hiện như vậy:

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

Trong ví dụ của bạn, có vẻ như bạn muốn lấy đầu ra của lệnh MySQL và lưu các bộ phận của dòng đầu ra vào mạng con. Tôi sẽ chỉ cho bạn cách để nắm bắt các dòng vào mảng, và cho rằng, bạn sẽ có thể tìm ra cách để đưa subarrays vào đó chính mình.

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

Nó cũng đáng nói đến là cho các loại hình hoạt động MySQL, nơi bạn không cần phải ra siêu dữ liệu (chẳng hạn như định dạng và bảng tên khá), bạn có thể sử dụng tùy chọn MySQL của -B để làm 'đầu ra hàng loạt'.

+0

Tôi cố gắng càng sớm càng tốt và tôi cung cấp cho bạn thông tin phản hồi, cảm ơn! –

+0

wonderfull! cảm ơn rất nhiều! –

+2

Không sao, tôi thực sự vui vì tôi đã có thể giúp đỡ! Nếu bạn muốn tìm hiểu thêm về mảng của Bash theo cách của riêng bạn, hãy xem các ví dụ tại đây: http://tldp.org/LDP/abs/html/arrays.html –

2

Bản ghi cấp trường có thể được truy cập thông qua lệnh read -aIFS được đặt thành chuỗi trống để ngăn đọc từ tước khoảng trắng đầu và cuối khỏi dòng.

#!/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

Không hoạt động với khoảng trống trong các giá trị trả về vì chúng sẽ được chia thành các mục riêng biệt của mảng bằng cách đọc -a. – Jeroen

+0

Dòng đầu tiên sẽ là tên cột. không phải là sạch nhất, nhưng tốt hơn là thêm: | sed 's # # _ # g' | sed 1d – Jeroen

Các vấn đề liên quan