2012-12-12 8 views
14

mio script necessario memorizzare in una struttura il risultato di una query:interrogazione Store a matrice in bash

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

Non ho idea di come conservare la matrice di {nome, mail} dal risultato della query ..

ho bisogno struttura come questa:

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

c'è un modo per fare questo in bash?

+0

perché bash? Puoi usare altri linguaggi come php, python, ruby ​​per fare lo stesso lavoro, e probabilmente è molto più semplice. – ajreal

risposta

16

array Bash vengono inizializzati in questo modo:

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

Per catturare le singole porzioni di output di un comando in un array, dobbiamo ciclo attraverso l'uscita, aggiungendolo di risultati alla matrice. Ciò può essere fatto in questo modo:

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

Nel tuo esempio, sembra che si desidera ottenere l'output di un comando MySQL e memorizzare le parti della sua linee di uscita in sottoarray. Ti mostrerò come catturare le linee negli array, e dato ciò, dovresti essere in grado di capire come mettere subarray in quello stesso.

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

E 'anche opportuno ricordare che per questo tipo di operazione MySQL, dove non hai bisogno di metadati di uscita (ad esempio i nomi di formattazione e di tabella belle), è possibile utilizzare l'opzione di MySQL -B fare 'uscita in batch'.

+0

Ci provo il prima possibile e ti do un feedback, grazie! –

+0

meraviglioso! molte grazie! –

+2

Nessun problema, sono davvero felice di essere stato in grado di aiutarti! Se vuoi saperne di più sugli array di Bash da soli, dai un'occhiata agli esempi qui: http://tldp.org/LDP/abs/html/arrays.html –

2

Il record del livello di campo è accessibile tramite il comando read -a e IFS è impostato sulla stringa vuota per impedire la lettura dallo stripping degli spazi bianchi iniziali e finali dalla linea.

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

Non funziona con gli spazi nei valori restituiti, poiché saranno divisi in elementi separati dell'array di read -a. – Jeroen

+0

Anche la prima riga sarà il nome della colonna. non il più pulito, ma sarebbe meglio aggiungere: | sed 's # # _ # g' | sed 1d – Jeroen