2009-04-19 170 views
6

我想從命令行使用bash向SQLite發送查詢。我需要逃避單引號和雙引號,並且將它們轉義出來,這樣bash不會誤解它們。以下是一個典型的查詢:如何通過bash shell在SQLite中轉義字符?

select * from contacts where source = "Nancy's notes"; 

如何從命令行發送此查詢?基本語法如下:

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

但是在這種情況下,shell會誤解單引號或雙引號。我嘗試使用雙斜槓和三斜槓進行轉義,但這不起作用。我很困惑。有什麼建議麼?

+0

也許這是要走的路: sqlite3-3.6.11.bin contacts.db 「從通訊錄中選擇*其中source = \」 南希的筆記\ 「」 – Tony 2009-04-19 22:11:17

回答

10

與MarkusQ的解決麻煩的是要知道哪些字符是特殊的雙引號內 - 有相當多的人,包括背蜱,美元開括號,美元變等

我會建議最好把單詞內部的字符串括起來;然後,需要由序列報價,反斜槓,報價,報價被替換的字符串內的每個單引號:

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

在更換第一報價終止當前單引號內的字符串;反斜線表示一個字面單引號,最後一個引號開始一個新的單引號字符串。此外,這一般適用於Bourne,Korn,Bash和POSIX shell。 (C Shell和衍生產品有更復雜的規則,需要反斜槓來轉義換行符,等等。)

1

如果bash是你唯一的問題,把整個東西用雙引號括起來,然後用一個反斜槓轉義在bash雙引號內特殊的東西。例如:

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

謝謝!在某些情況下,雙引號不應該被轉義(例如,如果它們在引用的源字符串內),但通常這種方法起作用。 – Tony 2009-04-19 22:51:36

+0

不,他們應該逃脫或bash會攔截他們。在引用的源字符串中,你應該使用一個逃逸的反斜槓,後跟一個轉義引號,即順序[\\\「]; sqlite將得到一個反斜槓和一個引號[\」],然後它應該解釋爲一個引號[ ] – MarkusQ 2009-04-19 23:03:06

1

這裏我使用兩個單引號,sqlite將其解釋爲一個。

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