2009-04-19 10 views
6

Estoy tratando de enviar una consulta a SQLite desde la línea de comandos usando bash. Necesito escapar tanto de las comillas simples como de las comillas dobles, y escapar de ellas para que bash no las malinterprete. Aquí está una consulta típica:¿Cómo puedo escapar caracteres en SQLite a través de bash shell?

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

¿Cómo puedo enviar esta consulta desde la línea de comandos? La sintaxis básica es algo como esto:

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

Pero en este caso, el shell interpreta mal o bien las comillas simples o dobles. Intenté escapar utilizando barras diagonales dobles y triples pero esto no funciona. Estoy confundido. ¿Alguna sugerencia?

+0

Tal vez este es el camino a seguir: contacts.db sqlite3-3.6.11.bin "seleccionar * de contactos donde source = \" notas de Nancy \ "" – Tony

Respuesta

10

El problema con la solución de MarkusQ es saber qué caracteres son especiales entre comillas dobles - hay un buen montón de ellos, incluyendo copias de las garrapatas, paréntesis de dólares abierta, en dólares variables, etc.

Sugeriría que sea mejor encerrar la cadena dentro de comillas simples; entonces, cada comilla simple dentro de la cadena necesita ser reemplazado por la cita secuencia, la barra invertida, cita, cita:

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

La primera cita en la sustitución termina la cadena entre comillas simples actual; la comilla invertida representa una comilla simple literal, y la comilla final inicia una nueva cadena comilla simple. Además, esto funciona con los proyectiles Bourne, Korn, Bash y POSIX en general. (C Shell y derivados tienen reglas más complejas que requieren barras invertidas para escapar de líneas nuevas, etc.)

+0

+1, mejor solución. Había olvidado la concatenación implícita. – MarkusQ

+0

¡Excelente! Gracias por esto. – Tony

1

Si bash es su único problema, enciérrelo entre comillas dobles y luego escape todo lo que sea especial dentro de bash comillas dobles con una sola barra inclinada invertida. Por ejemplo:

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

Gracias! En algunos casos, las comillas dobles no se deben escapar (si están dentro de la cadena fuente citada, por ejemplo), pero en general este enfoque funciona. – Tony

+0

No, deberían _siempre_ escaparse o bash los interceptaría. Dentro de la cadena fuente citada, debe usar una barra invertida escapada seguida de una comilla escapada, es decir, la secuencia [\\\ "]; sqlite obtendrá una barra diagonal inversa y una comilla [\"] que luego debería interpretar como una comilla [" ] dentro de la cadena. – MarkusQ

1

Aquí uso dos comillas simples que sqlite interpreta como una sola.

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