2009-10-28 28 views
31

我需要一个变量来保存从数据库中检索到的结果。到目前为止,这基本上是我尝试没有成功的。bash脚本 - 从数据库中选择到变量中

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a) 

我对bash命令的理解不是很好,你可以看到。

回答

33

我不知道很多关于MySQL命令行界面,但假设你只需要与扑帮助,你应该尝试要么换周围的命令,像这样:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password) 

其回声串到MySQL中。或者,你可以更花哨和使用一些新的bash的特性(这里的字符串)

myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a") 

导致同样的事情(假设你使用的是最新的bash足够版本),不涉及回声。

请注意,-p $密码不是拼写错误,而是MySQL希望通过命令行输入密码的方式(选项和值之间没有空格)。

请注意,myvariable将包含标准输出(通常是除错误消息之外的所有内容)的MySQL输出的所有内容,包括任何和所有列标题,ASCII艺术框架等等,这些可能或可能不是您想要的。

编辑:
正如已指出的,似乎是一个-e参数到MySQL,我会去那一个,肯定。

+0

谢谢,mysql命令也不喜欢-p ..我需要使用--password = $ password。 – imnotneo 2009-10-28 13:29:09

+1

您也可以将配置文件(称为.my.cnf)添加到您的主文件夹,该文件夹将自动插入您的选项。这可以节省您的脚本 – Yitzchak 2011-09-14 20:34:30

+0

+1 .my.cnf中的一些混淆 - 特别是从脚本中获取密码。 -N选项可用于修剪字段名称。 – ErichBSchulz 2014-01-19 02:49:36

12

你必须在管道周围的其他方式,你需要呼应查询,例如:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password) 

另一种方法是只使用mysql客户端,这样

myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a") 

(需要-s以避免ASCII-art)

现在,BASH并不是处理这种类型场景的最合适的语言,尤其是处理字符串a nd分裂SQL结果等。你必须努力工作才能在Perl,Python或PHP中获得非常简单的事情。

例如,你将如何获得A,B和C各自的变量?这当然是可行的,但是如果你不懂管道和echo(非常基本的shell),那么你做这件事并不是一件容易的事情,所以如果可能的话我会使用更适合的语言。

44

更直接的方法是:

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a") 
+5

我正在搜索s参数,尽管您需要提供两次以抑制要打印的列名称 – 2014-04-20 10:08:57

+0

这应该是最好的答案,它不会返回列名! – user3479125 2015-06-05 09:51:49

+1

我认为必须删除'-p'和密码之间的空格。 – frb 2015-10-02 11:04:27

14

读取数据线,由线到Bash的数组,你可以这样做:

while read -a row 
do 
    echo "..${row[0]}..${row[1]}..${row[2]}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 

或进入各个变量:

while read a b c 
do 
    echo "..${a}..${b}..${c}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 
+0

'语法错误附近的意外令牌'<' cut.sh:第26行:'done <<' – thevoipman 2015-07-20 09:28:18

+0

@thevoipman:很可能您的脚本没有使用Bash。你的朋友说什么?另外,由于我看不到您的脚本,因此我无法看到错误可能在哪里。 – 2015-07-20 11:42:43

+0

@thevoipman进程替换似乎是你的问题(是的,我知道,一年前,如果有人看到),但也许可以使用管道而不是在你使用的任何shell中进行反向操作,即'回声... | mysql ... |而读-a行;做...; done'。请记住,while body是在一个子shell中,并不会影响它周围的外壳。 – falstro 2016-10-10 18:19:56

3
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a) 

没有之后的空白。它微不足道,但没有工作。

0
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT 
    use databaseName; 
    SELECT fieldName FROM tablename WHERE filedName='fieldValue'; 
QUERY_INPUT 
) 
echo "myvariable=$myvariable" 
+0

当提供解决问题的代码时,最好也至少简单说明它是如何工作的,以便人们阅读时不必从头到尾思路分析,以了解差异。 – Fluffeh 2012-09-28 09:11:29

5

如果你想使用bash中使用单个值:

companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1) 

    echo "$companyid" 
+0

这确实将单个值读入变量 – bebbo 2016-02-08 14:54:40

0

当表名或数据库包含不受支持的字符,如空间,或又如“ - ”

db='data-base' 

db_d='' 
db_d+='`' 
db_d+=$db 
db_d+='`' 

myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"` 
0

如果您有特定的数据库名称和要在其上执行查询的主机,请按照以下查询:

outputofquery = $(mysql -u“$ dbusername”-p“$ dbpassword”-h“$ dbhostname”-e“SELECT A,B,C FROM table_a;”$ dbname)

因此,要运行mysql查询你需要在linux上安装mysql客户端