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

imn*_*neo 36 mysql sql bash scripting

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

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

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

enn*_*ler 61

更直接的方法是:

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

  • 我正在搜索s param,虽然你需要提供两次以抑制要打印的列名 (7认同)
  • 我认为必须删除 `-p` 和密码之间的空格。 (2认同)

fal*_*tro 44

我不太了解MySQL命令行界面,但假设你只需要帮助进行抨击,你应该尝试交换命令,如下:

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

将字符串回显到MySQL.或者,您可以更加花哨并使用一些新的bash功能(此处为字符串)

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

导致相同的事情(假设您正在使用最近的足够的bash版本),而不涉及回声.

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

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

编辑:
正如已经指出的那样,-eMySQL 似乎有一个参数,我肯定会去那个参数.


Pau*_*ce. 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)
Run Code Online (Sandbox Code Playgroud)

或者变成个别变量:

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)
Run Code Online (Sandbox Code Playgroud)


Vin*_*vic 12

你有相反的管道,你需要回显查询,如下所示:

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

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

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

(-s需要避免使用ASCII艺术)

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

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


小智 8

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

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

  echo "$companyid"
Run Code Online (Sandbox Code Playgroud)

  • mysql 接受 `--skip-column-names (-N)` 而不是 `| 切-f1` (3认同)

小智 5

另一种方式:

你的脚本:

#!/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
Run Code Online (Sandbox Code Playgroud)

  • ``-N`` 可用于``--skip-column-names`` (4认同)