将mysql查询输出存储到shell变量中

时间:2009-10-28 12:33:51

标签: mysql sql bash scripting

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

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

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

11 个答案:

答案 0 :(得分:56)

更直接的方式是:

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

答案 1 :(得分:42)

我对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艺术帧等等,这些可能是您想要的,也可能不是。

修改:
正如已经指出的那样,MySQL似乎有一个-e参数,我肯定会去那个参数。

答案 2 :(得分:15)

要逐行读取数据到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)

答案 3 :(得分: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艺术的必要条件)

现在,BASH不是处理此类场景的最合适的语言,尤其是处理字符串和拆分SQL结果等。你需要做很多工作才能在Perl,Python或PHP中获得非常非常简单的东西。

例如,如何在自己的变量上获得A,B和C中的每一个?这肯定是可行的,但是如果你不理解管道和回声(非常基本的shell东西),那么你不会轻松完成任务,所以如果可能的话,我会使用更合适的语言。

答案 4 :(得分:7)

如果要在bash中使用单个值:

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

  echo "$companyid"

答案 5 :(得分:3)

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

-p后没有空格。它琐碎,但没有不起作用。

答案 6 :(得分:1)

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

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

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

答案 7 :(得分: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"

答案 8 :(得分:0)

Another example when the table name or database contains unsupported characters such as a space, or '-'

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;"`

答案 9 :(得分:0)

其他方式:

您的脚本:

#!/bin/sh

# Set these variables
MyUSER="root"   # DB_USERNAME
MyPASS="yourPass"   # DB_PASSWORD
MyHOST="yourHost"    # DB_HOSTNAME
DB_NAME="dbName"
CONTAINER="containerName" #if use docker

# Get data
data=$($MyHOST -u $MyUSER -p$MyPASS $DB_NAME -h $CONTAINER -e "SELECT data1,data2 from table_name LIMIT 1;"  -B --skip-column-names)

# Set data
data1=$(echo $data | awk '{print $1}')
data2=$(echo $data | awk '{print $2}')

# Print data
echo $data1 $data2

答案 10 :(得分:0)

我的两分钱在这里

myvariable=$(mysql database -u $user -p$password -sse "SELECT A, B, C FROM table_a" 2>&1 \
   | grep -v "Using a password")

同时删除列名和烦人(但必要)的密码警告。感谢@Dominic Bartl和John为this answer