2009-04-19 6 views
6

Ich versuche, eine Abfrage an SQLite von der Befehlszeile mit bash zu senden. Ich muss sowohl einfachen Anführungszeichen als auch doppelten Anführungszeichen entgehen und ihnen entkommen, damit bash sie nicht falsch interpretiert. Hier ist eine typische Abfrage:Wie kann ich Zeichen in SQLite über Bash Shell entkommen lassen?

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

Wie kann ich diese Abfrage über die Befehlszeile senden? Die grundlegende Syntax ist so etwas wie folgt aus:

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

Aber in diesem Fall ist die Schale falsch interpretiert entweder die einfache oder doppelte Anführungszeichen. Ich habe versucht, mit Doppel-und Dreifach-Schrägstriche entkommen, aber das funktioniert nicht. Ich bin benommen. Irgendwelche Vorschläge?

+0

Vielleicht ist dies der Weg zu gehen: sqlite3-3.6.11.bin contacts.db "von Kontakten * wählen, wo source = \" Notizen des Nancy \ "" – Tony

Antwort

10

Das Problem mit MarkusQ Lösung ist, zu wissen, welche Zeichen in doppelten Anführungszeichen speziell sind - es gibt eine ganze Menge von ihnen, darunter Back-Zecken, Dollar-Klammer auf, Dollar-Variable usw.

Ich würde vorschlagen, es ist besser, die Zeichenfolge in einfache Anführungszeichen einzuschließen; Dann muss jede Apostroph in der Zeichenfolge, die durch das Sequenz-Zitat ersetzt werden, umgekehrten Schrägstrich, Zitat, Zitat:

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

Das erste Zitat im Ersatz beendet die aktuellen einfachen Anführungszeichen string; Das umgekehrte Schrägstrich-Anführungszeichen stellt ein literales einfaches Anführungszeichen dar, und das letzte Anführungszeichen beginnt mit einer neuen Zeichenfolge in einfacher Anführungszeichen. Außerdem funktioniert dies im Allgemeinen mit Bourne-, Korn-, Bash- und POSIX-Shells. (C-Shell und Derivate haben komplexere Regeln, die umgekehrte Schrägstriche erfordern, um Zeilenumbrüche zu umgehen usw.)

+0

+1, bessere Lösung Ich hatte die implizite Verkettung vergessen – MarkusQ

+0

Excellent! Thanks for this. – Tony

1

Wenn Bash Ihr einziges Problem ist, schließen Sie das Ganze in Anführungszeichen ein und entziehen Sie dann alles, was in Bash-Anführungszeichen mit einem einzigen Backslash speziell ist. ZB:

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

Dank! In einigen Fällen sollten doppelte Anführungszeichen nicht maskiert werden (wenn sie beispielsweise innerhalb der quotierten Quellzeichenfolge liegen), aber im Allgemeinen funktioniert dieser Ansatz. – Tony

+0

Nein, sie sollten _allem_ entkommen oder bash wird sie abfangen. Innerhalb der quoted Source-Zeichenfolge sollten Sie einen Escape-Backslash gefolgt von einem Escape-Zitat verwenden, dh die Sequenz [\\\ "]; sqlite erhält einen umgekehrten Schrägstrich und ein Zitat [\"], das es dann als Zitat interpretieren sollte [" ] innerhalb der Zeichenfolge – MarkusQ

1

Hier verwende ich zwei einfache Anführungszeichen, die sqlite als eins interpretiert.

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