2009-04-19 12 views
6

Tôi đang cố gắng gửi truy vấn đến SQLite từ dòng lệnh bằng bash. Tôi cần phải thoát khỏi cả hai dấu ngoặc đơn và dấu ngoặc kép, và thoát khỏi chúng để bash không hiểu sai chúng. Đây là một truy vấn thông thường:Làm cách nào để thoát khỏi các ký tự trong SQLite qua bash shell?

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

Làm cách nào để gửi truy vấn này từ dòng lệnh? Cú pháp cơ bản là một cái gì đó như thế này:

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

Nhưng trong trường hợp này, trình bao diễn giải sai một hoặc hai dấu ngoặc kép. Tôi đã cố gắng thoát bằng cách sử dụng cả hai đôi và ba slashes nhưng điều này không hoạt động. Tôi bị quấy rầy. Bất kỳ đề xuất?

+0

Có lẽ đây là con đường để đi: contacts.db sqlite3-3.6.11.bin "chọn * từ danh bạ nơi source = \" ghi chú của Nancy \ "" – Tony

Trả lời

10

Vấn đề với giải pháp MarkusQ được biết mà nhân vật đặc biệt bên trong dấu ngoặc kép - có khá nhiều trong số họ, bao gồm back-ve, ngoặc đô la mở, đồng USD biến vv

Tôi khuyên bạn nên gửi kèm theo chuỗi trong dấu nháy đơn; sau đó, mỗi trích dẫn đơn lẻ bên trong chuỗi cần phải được thay thế bằng dấu ngoặc kép, dấu gạch chéo ngược, trích dẫn, trích dẫn:

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

Trích dẫn đầu tiên thay thế chấm dứt chuỗi đơn được trích dẫn hiện tại; dấu gạch chéo ngược-trích dẫn đại diện cho một dấu ngoặc đơn, và trích dẫn cuối cùng bắt đầu một chuỗi trích dẫn đơn mới. Hơn nữa, điều này làm việc với vỏ Bourne, Korn, Bash và POSIX nói chung. (C Shell và các dẫn xuất có các quy tắc phức tạp hơn cần các dấu gạch chéo ngược để thoát khỏi các dòng mới, v.v.)

+0

+1, giải pháp tốt hơn Tôi đã quên về việc ghép nối tiềm ẩn – MarkusQ

+0

Tuyệt vời! Cảm ơn vì điều này. – Tony

1

Nếu bash là vấn đề duy nhất của bạn, hãy đính kèm toàn bộ nội dung trong dấu ngoặc kép và sau đó thoát bất kỳ thứ gì đặc biệt trong dấu ngoặc kép kép bằng dấu gạch chéo ngược đơn. Ví dụ:

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

Cảm ơn! Trong một số trường hợp, không nên bỏ dấu ngoặc kép (nếu chúng nằm trong chuỗi nguồn được trích dẫn, ví dụ), nhưng nói chung cách tiếp cận này hoạt động. – Tony

+0

Không, họ nên _always_ được thoát hoặc bash sẽ chặn chúng. Bên trong chuỗi nguồn được trích dẫn, bạn nên sử dụng dấu gạch chéo thoát được theo sau bởi dấu trích dẫn thoát, tức là chuỗi [\\\ "]; sqlite sẽ nhận dấu gạch chéo ngược và dấu [\"] mà sau đó nó sẽ diễn giải dưới dạng báo giá [" bên trong chuỗi – MarkusQ

1

Ở đây tôi sử dụng hai dấu nháy đơn mà sqlite hiểu là một.

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