我正在尝试使用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"
如何只将数字传递给查询?
答案 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
。样本:
使用单个awk
命令:
current_temp=$( awk 'NR==2 {print $10}' /sys/bus/w1/devices/xxx/w1_slave )
使用纯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)"
遗憾的是,我现在还没有对它进行测试