2009-04-19 19 views
6

Próbuję wysłać zapytanie do SQLite z wiersza poleceń przy użyciu bash. Muszę uciec zarówno z pojedynczych cudzysłowów, jak i podwójnych cudzysłowów, i uciec od nich, aby bash ich nie interpretował. Oto typowe zapytanie:Jak mogę uniknąć znaków w SQLite przez powłokę bash?

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

Jak wysłać to zapytanie z wiersza poleceń? Podstawowa składnia jest taka:

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

Ale w tym przypadku powłoka źle interpretuje pojedyncze lub podwójne cudzysłowy. Próbowałem ucieczki przy użyciu podwójnych i potrójnych ukośników, ale to nie działa. Jestem zdezorientowany. Jakieś sugestie?

+0

Może to jest droga: sqlite3-3.6.11.bin contacts.db "select * from kontaktów gdzie source = \" notatki Nancy \ "" – Tony

Odpowiedz

10

Kłopot z roztworem MarkusQ jest wiedzieć, jakie znaki są specjalne wewnątrz podwójnych cudzysłowów - są sporo z nich, w tym back-kleszcze, Dolar otwarty nawias, Dolar zmiennej itd

Sugerowałbym, że lepiej jest zamknąć ciąg wewnątrz pojedynczych cudzysłowów; Następnie każdy pojedynczy cudzysłów wewnątrz łańcucha musi być zastąpiona przez sekwencję cytatem, backslash, cytuję, cytuję:

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

Pierwszy cytat w wymianie kończy bieżące pojedynczy cytowany string; odwrotny ukośnik-cudzysłów reprezentuje literalny pojedynczy cudzysłów, a końcowy cytat rozpoczyna nowy ciąg o pojedynczym cudzysłowiu. Co więcej, działa to z powłokami Bourne, Korn, Bash i POSIX w ogóle. (C Skorupy i instrumenty pochodne mają bardziej złożone reguły wymagające ukośników, aby uciec przed znakami nowej linii, i tak dalej.)

+0

+1, lepsze rozwiązanie Zapomniałem o ukrytej konkatenacji – MarkusQ

+0

Świetnie! Dzięki za to. – Tony

1

Jeśli Twoim jedynym problemem jest bash, ułóż je w podwójny cudzysłów, a następnie uniknij wszystkiego, co jest wyjątkowe w podwójnych cudzysłowach bash z pojedynczym ukośnikiem odwrotnym. Np:

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

Dzięki! W niektórych przypadkach podwójne cudzysłowy nie powinny być unikane (jeśli są na przykład w cytowanym łańcuchu źródłowym), ale ogólnie to podejście działa. – Tony

+0

Nie, powinny one zawsze zostać usunięte lub bash je przechwyci. Wewnątrz cytowanego ciągu źródłowego powinieneś użyć uciekającego ukośnika odwrotnego, po którym następuje cytowana wycinka, tzn. Sekwencja [\\\ "]; sqlite otrzyma ukośnik odwrotny i cytat [\"], który powinien następnie interpretować jako cytat [" ] wewnątrz struny – MarkusQ

1

Używam tutaj dwóch pojedynczych cudzysłowów, które sqlite interpretuje jako jedno.

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