我正在尝试编写一个 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 元字符。例如,如果您位于包含文件 foo
和 bar
的目录中,则:
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/