如何通过bashshell转义SQLite中的字符?

如何通过bashshell转义SQLite中的字符?,bash,sqlite,shell,command-line,escaping,Bash,Sqlite,Shell,Command Line,Escaping,我试图使用bash从命令行向SQLite发送查询。我需要转义单引号和双引号,并转义它们,以便bash不会误解它们。以下是一个典型的查询: select * from contacts where source = "Nancy's notes"; 如何从命令行发送此查询?基本语法如下所示: sqlite3.bin contacts.db 'select * from contacts where source = "Nancy's notes"' 但在这种情况下,shell误解了单引号或双引

我试图使用bash从命令行向SQLite发送查询。我需要转义单引号和双引号,并转义它们,以便bash不会误解它们。以下是一个典型的查询:

select * from contacts where source = "Nancy's notes";
如何从命令行发送此查询?基本语法如下所示:

sqlite3.bin contacts.db 'select * from contacts where source = "Nancy's notes"'

但在这种情况下,shell误解了单引号或双引号。我尝试过使用双斜杠和三斜杠逃跑,但这不起作用。我糊涂了。有什么建议吗?

如果bash是您唯一的问题,请用双引号将整个内容括起来,然后用一个反斜杠将bash双引号中的任何特殊内容转义。例如:

sqlite3.bin contacts.db "select * from contacts where source = \"Nancy's notes on making \$\$\$\""

MarkusQ解决方案的问题在于知道哪些字符在双引号中是特殊的——它们有很多,包括反勾号、美元开括号、美元变量等等

我建议最好将字符串括在单引号内;然后,字符串中的每个单引号都需要替换为序列引号、反斜杠、引号、引号:

sqlite3.bin contacts.db 'select * from contacts
      where source = "Nancy'\''s notes"'

替换中的第一个引号终止当前的单引号字符串;反斜杠引号表示一个文字单引号,最后一个引号开始一个新的单引号字符串。此外,这通常适用于Bourne、Korn、Bash和POSIX shell。(C Shell和派生类有更复杂的规则,需要反斜杠来转义换行符,等等。)

这里我使用两个单引号,sqlite将其解释为一个引号

sqlite3.bin contacts.db "select * from contacts where source = 'Nancy''s notes on making \$\$\$'"
foo_double_single_quote=`echo${foo_with_single_quote}sed“s/\'/\'/\'\'/'g`
sqlite3“插入到bar_表(baz_colname)值('${foo_double_single_quote}')

如果您有一个带有单引号的变量
foo\u,其内容要插入到数据库中,您可以像这样使用
sed
来创建一个变量,该变量的
字符根据需要进行复制。

也许这就是方法:sqlite3-3.6.11.bin contacts.DB“从contacts中选择*,其中source=\“Nancy's notes”谢谢在某些情况下,不应转义双引号(例如,如果双引号位于带引号的源字符串中),但通常这种方法是有效的。不,应始终转义双引号,否则bash将截获双引号。在带引号的源字符串中,您应该使用一个转义反斜杠,后跟一个转义引号,即序列[\\\”];sqlite将得到一个反斜杠和一个引号[\”],然后应该将其解释为字符串中的引号[“]。+1,更好的解决方案。我忘记了隐式连接。