Как я могу избежать символов в SQLite через оболочку bash? - PullRequest
6 голосов
/ 20 апреля 2009

Я пытаюсь отправить запрос на SQLite из командной строки, используя bash. Мне нужно избегать как одинарных, так и двойных кавычек, и избегать их, чтобы bash не интерпретировал их неправильно. Вот типичный запрос:

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

Как я могу отправить этот запрос из командной строки? Основной синтаксис выглядит примерно так:

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

Но в этом случае оболочка неправильно интерпретирует одинарные или двойные кавычки. Я пытался убежать, используя как двойные, так и тройные слэши, но это не сработало. Я сбит с толку. Есть предложения?

Ответы [ 3 ]

11 голосов
/ 20 апреля 2009

Проблема с решением MarkusQ состоит в том, чтобы знать, какие символы являются специальными в двойных кавычках - их довольно много, в том числе обратные тики, открывающие доллар скобки, переменные доллара и т.д.

Я бы предположил, что лучше заключить строку в одинарные кавычки; затем каждая отдельная кавычка внутри строки должна быть заменена на кавычку последовательности, обратную косую черту, кавычку, кавычку:

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

Первая кавычка в замене завершает текущую строку в одинарных кавычках; кавычка с обратной косой чертой представляет собой буквальную одинарную кавычку, а последняя кавычка начинает новую строку с одинарными кавычками. Кроме того, это работает с оболочками Bourne, Korn, Bash и POSIX в целом. (C Shell и производные имеют более сложные правила, требующие обратной косой черты, чтобы избежать перевода строки и т. Д.)

1 голос
/ 29 июня 2012

Здесь я использую две одинарные кавычки, которые sqlite интерпретирует как одну.

sqlite3.bin contacts.db "select * from contacts where source = 'Nancy''s notes on making \$\$\$'"
1 голос
/ 20 апреля 2009

Если bash - ваша единственная проблема, заключите все в двойные кавычки, а затем избегайте всего, что особенное в двойных кавычках bash, с одной обратной косой чертой. E.g.:

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