LINUX.ORG.RU

Помогите правильно разобраться с кавычками в sh скрипте

 


1

1

Добрый день, помогите правильно разобраться с кавычками: После запуска контейнера «db» с БД необходимо зайти зайти в консоль mysql и выдать права пользователю ‘anton’@‘localhost’:

sudo docker compose exec db sh -c 'mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "CREATE USER 'anton'@'localhost' IDENTIFIED BY '${MYSQL_PASSWORD}' WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'anton'@'localhost'; exit;"'

Получаю ошибку синтаксиса

start.sh: line 63: unexpected EOF while looking for matching `"'
start.sh: line 64: syntax error: unexpected end of file

У Вас проблема с одинарными кавычками. Там, где 'anton'@'localhost' и '${MYSQL_PASSWORD}', Ваша строка, по сути, заканчивается, после чего идёт anton, @, localhost и ${MYSQL_PASSWORD} как отдельные параметры.

К тому же первая ошибка указывает на то, что где-то кавычка забыта.

dikey0ficial
()
Ответ на: комментарий от teod0r

Немного правильнее sudo MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ... \"-p\${MYSQL_ROOT_PASSWORD}\" -e ... Ибо если в ${MYSQL_ROOT_PASSWORD} есть кавычки, то у вас сломается.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

а там кавычки просто работают:

v = 42
command "aaa bb ccc dddd"$v" eeee" " zzzzzzzzzzzzz"

Переданные аргументы будут содержать массив типа этого (синтаксис js/python):

["command", "aaa bb ccc dddd 42 eeee", " zzzzzzzzzzzzz"]

Экранировать нужно так:

'"текст в кавычках"' # "текст в кавычках"
'"текст в кавычках'"''"' # "текст в кавычках\"" в нормальеых языках
uwuwuu
()
Ответ на: комментарий от vodz

Ибо если в ${MYSQL_ROOT_PASSWORD} есть кавычки, то у вас сломается.

Т.е. должно быть так:

sudo docker compose exec db sh -c "mysql -uroot -p\"${MYSQL_ROOT_PASSWORD}\" -e \"CREATE USER anton@localhost IDENTIFIED BY \\\"${MYSQL_PASSWORD}\\\" WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO anton@localhost; exit;\""
?
Так правильно, если будут оба вида кавычек в пароле?

teod0r ★★★★★
()

необходимо зайти зайти в консоль mysql и выдать права пользователю ‘anton’@‘localhost’:

это будет стоить вам от 1 миилиарда афгани

если вы согласны - просто переводите деньги

smilessss ★★★★★
()
Ответ на: комментарий от teod0r

Т.е. должно быть так:

Нет. Я же написал как. sudo очищает нестандартные переменные окружения, но допускает в качестве аргументов до команды установку нужных для передачи в команду переменных в виде var=value. Защита от кавычек получается путем передачи в скрипт произвольных символов в виде переменной, а не раскрытием переменной во внешнем скрипте как у вас.

vodz ★★★★★
()
Ответ на: комментарий от teod0r

можно правильный вариант целиком???

Да боже мой. Ну как можно не понять то что написано? Сказал же - «немного», что означает взять полностью ваш вариант и поменять то, что написано, оставив что точками — ваш вариант.

То есть: к sudo дописать

sudo MYSQL_ROOT_PASSWORD=«$MYSQL_ROOT_PASSWORD»

а вместо -p'${MYSQL_ROOT_PASSWORD}' написать

\"-p\${MYSQL_ROOT_PASSWORD}\"

всё.

vodz ★★★★★
()