mysql - 尝试构建涉及 MySQL 的 Bash 可执行字符串

标签 mysql linux bash

我正在尝试编写一个 Bash 脚本,以从脚本中构造的字符串运行 MySQL 查询。我已经能够构建查询字符串,并且在回显时看起来是正确的。我可以将它剪切并粘贴到 shell 命令行中,然后它就会运行。但是,我需要基本上将查询结果缩减为 OK 或 CRITICAL 等词。没有其他的。当我尝试将查询结果保存到 bash 变量时,我得到:

mysql: 未知选项 '-2'

如果我删除 grep 并删除代码,我将得到 mysql --help 结果。所以,它不喜欢我的 mysql 字符串,但我不知道为什么。帮忙?

顺便说一句——运行 CentOS 6.3

alert=`mysql myDB -e "select value from config_table where name=\"ach_alert_time\"\G" | /bin/grep value: | /bin/cut -f2 -d:`
echo $alert  #Brings back 18,50,00

sql="mysql myDB -e 'select if(count(*) > 0,\"CRITICAL\",\"OK\") as STATUS from xyz_batch where timestamp > concat(date(now()),\" \",maketime("$alert"))\G' | /bin/grep OK  | /bin/cut -f2 -d:"
echo $sql # mysql myDB -e 'select if(count(*) > 0,"CRITICAL","OK") as STATUS from xyz_batch where timestamp > concat(date(now())," ",maketime( 18,50,00))\G' | /bin/grep OK | /bin/cut -f2 -d

status=`$sql`

# Whoops!
# mysql: unknown option '-2'

echo $status

最佳答案

问题是,当您将 $sql 作为命令运行时,它会进行分词、文件名扩展等操作,而不考虑 $ 的任何引号sql 可能包含。而且它不会处理管道和其他 shell 元字符。例如,如果您位于包含文件 foobar 的目录中,则:

cmd="echo '     *     ' | grep baz"
$cmd

将打印 ' bar foo ' | grep baz — 它不会保留空格,它会将 * 扩展成一个文件列表,它会处理 |grep 作为 echo 的参数。

您可以通过使用命令 eval "$sql" 而不仅仅是 $sql 来解决这个问题:

status=`eval "$sql"`

但是您可能想重新评估一下您的设计。也许有更好的方法来实现您想要的?


编辑添加:你说你在脚本中构建查询,但你真的需要将整个命令存储在一个变量中吗?像这样:

sql="select if(count(*) > 0,\"CRITICAL\",\"OK\") as STATUS from xyz_batch where timestamp > concat(date(now()),\" \",maketime("$alert"))\G"
status=`mysql myDB -e "$sql" | /bin/grep OK  | /bin/cut -f2 -d:`

不会有这个问题,因为那时 $sql 只是一个参数,所以你不需要 Bash 对它做任何特殊的事情。

关于mysql - 尝试构建涉及 MySQL 的 Bash 可执行字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12114268/

相关文章:

php mysql 多条件查询

MySql 查询排序

PHP session 在前往另一个页面时无法识别变量

c - Ubuntu 上的套接字(不允许操作)

linux - SSH 命令不是从 bash 脚本内部运行,而是从 shell 运行

regex - 在与 sed 的最后一场比赛之后追加行

php - 从 Android 手机更新数据库失败

android - 在 PXA270 设备上移植 Android 操作系统

c++ - 控制台程序偶尔不工作?

bash - MATLAB系统不运行应用程序