kruchkov-alexandr
@kruchkov-alexandr
VSAT engineer

Экранирование кавычек. Bash to mysql query

Добрый день, уже просто замучался, не знаю как быть.
Есть простой запрос(для примера)
UPDATE `my_db`.`Vlan` SET `number`='11' WHERE `id`='11';

Пытаюсь его сделать как

#!/bin/bash
query=«UPDATE `my_db`.`Vlan` SET `number`='11' WHERE `id`='11';»
mysql -u root -e "$query";


Ответом получаю только
/etc/script: line 2: my_db: command not found
/etc/tdma.sh: line 2: Vlan: command not found
/etc/tdma.sh: line 2: number: command not found


и так далее.

Как мне правильно все экранировать?
По-моему я уже все варианты перебрал, ничего не помогает.

Строку на обновление таблицы взял из Mysql WorkBench, таблицы не мои, мне их просто нужно обновить скриптом из баша.
Спасибо.
  • Вопрос задан
  • 10525 просмотров
Решения вопроса 1
blo
@blo
инженер-программист
Обратные кавычки (`) в bash выполняют команду, заключенную в них. Попробуйте без этих кавычек.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
AterCattus
@AterCattus
Люблю быстрый backend
Не всегда кавычки можно просто убрать (например если в именах БД, таблиц, полей используется '-'). Тут лучше заменить двойные кавычки " на одинарные '. Внутри них ` не обрабатывается как exec.
Ответ написан
Комментировать
@egorinsk
В bash абсоютно невменяемая система экранирования кавычек, но может вам поможет это: wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings

А вообще, я бы вынес запросы в отдельные файлы, чтобы не мучаться.
Ответ написан
Комментировать
stavinsky
@stavinsky
Рискую получить кучу минусов, но! Используйте Python)
Ответ написан
Комментировать
vyshkant
@vyshkant
developer
Столкнулся с похожей проблемой и решил этот вопрос обычным экранированием:
query="CREATE DATABASE \`${site_name}\`;"
mysql -u ${mysql_user} -p${mysql_password} -e "${query}"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы