Как лучше всего использовать объявленную переменную в bash в команде mysql? - PullRequest
0 голосов
/ 24 января 2019

Я пишу сценарий bash для автоматической установки и настройки системы, и мне нужно иметь возможность установить пароль root для mysql из объявленной переменной в сценарии, но я не могу заставить его работать.

read -p "Password `echo $'\n> '`" mysql_passwd

mysql --defaults-file=/etc/mysql/debian.cnf mysql -Bse 'UPDATE user SET password=PASSWORD("$mysql_passwd") WHERE User="root";flush privileges;'

При запуске команды из скрипта без переменной (только с паролем прямо в ней) она работает:

mysql --defaults-file=/etc/mysql/debian.cnf mysql -Bse 'UPDATE user SET password=PASSWORD("password") WHERE User="root";flush privileges;'

пробовал такие вещи, как:

PASSWORD("$mysql_passwd") 

PASSWORD("${mysql_passwd}")

PASSWORD('$mysql_passwd')

Нет сообщения об ошибке, пароль root не меняется.

Спасибо за чтение.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы должны поставить цитаты наоборот. Сначала двойные кавычки, затем одинарные кавычки:

mysql --defaults-file=/etc/mysql/debian.cnf mysql -Bse "UPDATE user SET password=PASSWORD('$mysql_passwd') WHERE User='root';flush privileges;"

Когда что-то экранируется одинарными кавычками, имена переменных не разрешаются.

Смотрите разницу здесь:

# a=asdf
#
# echo "'$a'"
'asdf'
# echo '"$a"'
"$a"
0 голосов
/ 24 января 2019

Вы создаете оператор SQL в строке в одинарных кавычках:

'UPDATE user SET password=PASSWORD("$mysql_passwd") WHERE User="root";flush privileges;'

Bash заменяет имена переменных ($mysql_passwd) только тогда, когда они пустые или в строке в двойных кавычках.В одиночной строке в кавычках это трактуется как «$ mysql_passwd».Например:

mysql_passwd="abcdef"
echo $mysql_passwd  # prints abcdef
echo "$mysql_passwd"  # prints abcdef
echo '$mysql_passwd'  # prints $mysql_passwd

Так что вам нужно либо поменять одинарные кавычки на двойные кавычки, и экранировать существующие двойные кавычки:

"UPDATE user SET password=PASSWORD(\"$mysql_passwd\") WHERE User=\"root\";flush privileges;"

Или завершить строку в одинарных кавычках, добавитьстрока в двойных кавычках с $mysql_passwd, а затем выполнить остальную часть запроса в другой строке в одинарных кавычках (bash объединяет строки, которые расположены рядом друг с другом, вот так):

'UPDATE user SET password=PASSWORD("'"$mysql_passwd"'") WHERE User="root";flush privileges;'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...