我有以下数据库:
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
'
'
"
答案 0 :(得分:1)
你试图嵌套单引号,但它不能那样工作。在您的第一个(“工作”)示例中,您的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认为这是一个列名并相应地抱怨。
你需要找到一种合适的方法来逃避最里面的引号,以便它们能够在shell中存活并传递给sqlite。
答案 1 :(得分:0)
将select语句周围的单引号更改为双引号...并将其转义。
lab-1:/tmp# ssh root@lab1.mydomain.net "sqlite3 /etc/ppd/page.db \"SELECT COUNT(*) FROM users where fname='John'\""