2012-12-12 14 views
14

Mój skrypt trzeba przechowywać w strukturze wyniku zapytania:zapytania Przechowywać w tablicy w bash

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

nie mam pojęcia w jaki sposób przechowywania tablicę {imię i nazwisko, mail} od wyniku zapytania ..

muszę strukturę takiego:

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

Czy istnieje sposób, aby zrobić to w bash?

+0

dlaczego bash? możesz używać innych języków takich jak php, python, ruby, aby wykonać tę samą pracę, i prawdopodobnie jest o wiele łatwiej – ajreal

Odpowiedz

16

tablice atakujących są inicjowane tak:

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

Aby wykonać poszczególne porcje wyjścia polecenia w tablicy należy pętla poprzez wyjście, dodanie go na wyniki w tablicy. Że można zrobić tak:

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

W przykładzie wygląda chcesz uzyskać dane wyjściowe polecenia MySQL i przechowywania tych części to linie wyjściowe do subarrays. Pokażę ci, jak przechwytywać linie na tablice, a biorąc pod uwagę to, powinieneś być w stanie wymyślić, jak umieścić subarieys w sobie.

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

Warto też wspomnieć, że dla tego rodzaju operacji MySQL, gdzie nie trzeba metadane wyjściowego (takich jak nazwy ładnych formatowania i tabeli), można wykorzystać -B opcję MySQL zrobić „wyjście partia”.

+0

Próbuję jak najszybciej i daję ci opinie, dziękuję! –

+0

wonderfull! wielkie dzięki! –

+2

Nie ma problemu, jestem naprawdę szczęśliwy, że mogłem pomóc! Jeśli chcesz dowiedzieć się więcej o tablicach Bash na własną rękę, zapoznaj się z przykładami tutaj: http://tldp.org/LDP/abs/html/arrays.html –

2

Dostęp do rekordu na poziomie pola można uzyskać za pomocą komendy read -a, a IFS jest ustawiony na pusty ciąg znaków, aby zapobiec odczytywaniu początkowych i końcowych spacji z linii.

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

Nie działa ze spacjami w zwracanych wartościach, ponieważ zostaną one podzielone na oddzielne elementy tablicy przez odczyt -a. – Jeroen

+0

Również pierwsza linia będzie nazwą kolumny. nie najczystsze, ale lepiej byłoby dodać: | sed # # _ # g '| sed 1d – Jeroen

Powiązane problemy