【问题标题】:connect to mysql db and execute query and export result to variable - bash script连接到 mysql db 并执行查询并将结果导出到变量 - bash 脚本
【发布时间】:2018-06-30 14:36:27
【问题描述】:

我想连接到mysql数据库并执行一些查询并将其结果导出到变量中,而所有这些都需要完全由bash脚本完成

我有一个 sn-p 代码,但不起作用。

#!/bin/bash

BASEDIR=$(dirname $0)
cd $BASEDIR

mysqlUser=n_userdb
mysqlPass=d2FVR0NA3
mysqlDb=n_datadb

result=$(mysql -u $mysqlUser -p$mysqlPass -D $mysqlDb -e "select * from confs limit 1")

echo "${result}" >> a.txt

什么问题?

【问题讨论】:

  • 有什么理由不直接将mysql 的输出重定向到文件中吗?此外,什么不起作用以及以何种方式不起作用(错误消息?)。您还需要双引号 all 变量扩展。
  • @Corrupted_S.K 无关。给定代码中的 -p 选项没有问题(除非他们应该使用 my.cnf 文件代替)。
  • 您是否收到错误消息或警告?
  • 不,这意味着错误不会保存到输出文件,因为您只是重定向标准输出,而不是标准错误。使用mysql ... 2>a-err.txt 重定向错误流。然后这些错误将在a-err.txt 中可用。

标签: mysql bash shell


【解决方案1】:

使用正确的密码解决了in the chat 的问题。

如果您还想只获取数据,请使用mysql-NB(或--skip-column-names--batch)。

此外,脚本需要引用变量扩展名,否则用户名/密码包含对 shell 来说特殊的字符会出现问题。此外,大写的变量名通常是为系统变量保留的。

#!/bin/sh

basedir=$(dirname "$0")

mysqlUser='n_userdb'
mysqlPass='d2FVR0NA3'
mysqlDb='n_datadb'

cd "$basedir" &&
mysql -NB -u "$mysqlUser" -p"$mysqlPass" -D "$mysqlDb" \
      -e 'select * from confs limit 1' >a.txt 2>a-err.txt

不过,理想情况下,您应该使用 my.cnf 文件来配置用户名和密码。

参见例如

【讨论】:

    【解决方案2】:

    这样做:

    result=$(mysql -u $mysqlUser -p$mysqlPass -D $mysqlDb -e "select * from confs limit 1" | grep '^\|' | tail -1)
    

    Bash 的 $() 语句无法处理包含多行的变量,因此上面的 hack 只抓取了有趣的部分:数据

    【讨论】:

    • Bash no 存在变量包含多行的问题。
    • 好吧,对不起,我说错了。 Bash 这样做没有问题,但命令 $() 可以。 @saeid a.txt 的内容是什么,您输入的具体内容是什么,您是否收到任何错误消息?它对我来说很好。
    • @Kusalananda 自从我编辑后,我们是否同意我现在表达它的方式?
    • 不抱歉,您仍然声称bash 在变量中的多行字符串存在某种问题。我不确定你从哪里得到这个。
    • @Kusalananda 不,我只是说在 Bash 中使用多行 $( ) 时将所有行合二为一是一种糟糕的处理方式。
    猜你喜欢
    • 2020-06-26
    • 2019-07-20
    • 1970-01-01
    • 2016-10-03
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多