我有以下数据库:
lab-1:~# sqlite3 /etc/ppd/page.db "select * from users"
John|Doe|Test|0||1|1234|6988|sip
Jane|Doh|test|0||3|6878|123@abc.com|smtp
lab-1:~# sqlite3 /etc/ppd/page.db ".schema"
CREATE TABLE users(fname varchar(100), lname varchar(100), description varchar(100),grp INTEGER, group_name varchar(100), destination_id varchar(100), p_number varchar(10), destination varchar(100), class varchar(10));这工作
通过bash脚本,下面的查询没有问题
lab-2:/tmp# ssh root@lab1.mydomain.net "sqlite3 /etc/ppd/page.db 'SELECT COUNT(*) FROM users WHERE destination='6981' AND p_number='9999''"
0
lab-2:/tmp#它正确地返回计数为0。
,这会使失败
但是当尝试基于fname字段查询时..。它会爆炸,像这样
lab-2:/tmp# ssh root@lab1.mydomain.net "sqlite3 /etc/ppd/page.db 'SELECT COUNT(*) FROM users where fname='John''"
Error: no such column: John只是想知道你是否能看到我的错误/错误。试着玩引号和单引号..。还试图添加"\“以转义select语句周围的引号.但到目前为止我还没搞清楚。
谢谢。
编辑1
这就是我向自己证明的,我有匹配的引号/我没有遗漏任何引号--我的查询如下所示:
"
sqlite3 /etc/ppd/page.db
'
SELECT COUNT(*) FROM users where fname='
John
'
'
"发布于 2018-02-09 19:32:17
你想套牢单引号,但不是那样的。在您的第一个示例(“工作”)中,您的shell看到五个字符串表示您的查询。它们是:
'SELECT COUNT(*) FROM users WHERE destination='
6981
' AND p_number='
9999
''由于没有分隔它们的空格,所以它将它们合并成一个参数,然后传递给sqlite:
SELECT COUNT(*) FROM users WHERE destination=6981 AND p_number=9999这是完全正确的。但是,在第二个示例中,shell可以看到以下三个字符串:
'SELECT COUNT(*) FROM users where fname='
John
''当混合在一起时,这些屈服:
SELECT COUNT(*) FROM users where fname=John由于John周围没有任何引号,所以sqlite假定这是一个列名,并相应地抱怨。
您将需要找到一种适当的方法来逃避最里面的引号,这样它们才能在外壳中存活下来,并被传递到sqlite中。
发布于 2018-02-09 19:31:28
将select语句周围的单引号更改为双引号.然后逃了出来。
lab-1:/tmp# ssh root@lab1.mydomain.net "sqlite3 /etc/ppd/page.db \"SELECT COUNT(*) FROM users where fname='John'\"" https://stackoverflow.com/questions/48712343
复制相似问题