2012-12-12 58 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