在MySQL查询中输出命令作为输入

时间:2014-08-14 18:13:20

标签: mysql bash variables

我正在尝试使用bash命令的输出作为sql-query的输入变量:

#!/bin/bash

mysql --user=root --password=root database << QUERY_INPUT

#Get temp from sensor.
current_temp=$(sed -n 2,2p /sys/bus/w1/devices/xxx/w1_slave | awk '{print $10}' | awk -F= '{print $2}')

#SQL query
INSERT INTO temperatures (tdate, ttime, temperature)
VALUES (CURRENT_DATE,CURRENT_TIMESTAMP,'$current_temp')
QUERY_INPUT

我得到了:

“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以便在'current_temp = 24750

附近使用正确的语法
INSERT INTO temperatures (tdate, ttime, temperature)
VALUES' at line 1"

如何只将数字传递给查询?

3 个答案:

答案 0 :(得分:2)

设置current_temp的命令不是SQL输出的一部分。将它移到here文档之外。

只有传递给mysql的代码才会出现在here文档中,这意味着您需要在此文档之外移动设置current_temp的命令和所有shell注释。

#!/bin/bash

#Get temp from sensor.
current_temp=$(sed -n 2,2p /sys/bus/w1/devices/xxx/w1_slave | awk '{print $10}' | awk -F= '{print $2}')

mysql --user=root --password=root database << QUERY_INPUT
INSERT INTO temperatures (tdate, ttime, temperature)
VALUES (CURRENT_DATE,CURRENT_TIMESTAMP,'$current_temp')
QUERY_INPUT

正如评论中所提到的,有几种方法可以简化设置current_temp。样本:

  1. 使用单个awk命令:

    current_temp=$( awk 'NR==2 {print $10}' /sys/bus/w1/devices/xxx/w1_slave )
    
  2. 使用纯bash

     { read; read -a fields; current_temp=${fields[9]}; } < /sys/bus/w1/devices/xxx/w1_slave
    

答案 1 :(得分:0)

试试这个:

INSERT INTO temperatures (tdate, ttime, temperature)
VALUES (CURRENT_DATE,CURRENT_TIMESTAMP,'"$current_temp"')
QUERY_INPUT

在单引号中引用“$ current_temp”应该将字符串作为带引号的字符串传递,该字符串对SQL有效。

答案 2 :(得分:0)

试试这个

#!/bin/bash
current_temp=$(sed -n 2,2p /sys/bus/w1/devices/xxx/w1_slave | awk '{print $10}' | awk -F= '{print $2}')
mysql --user=root --password=root database -e "INSERT INTO temperatures (tdate, ttime, temperature) VALUES (CURRENT_DATE,CURRENT_TIMESTAMP,$current_temp)"

遗憾的是,我现在还没有对它进行测试