如何在mysql命令的bash中最好使用声明的变量?

时间:2019-01-24 08:51:19

标签: mysql bash mariadb

我正在编写一个用于自动安装和配置系统的bash脚本,我需要能够从脚本中声明的变量设置mysql的root密码,但我无法使其正常工作。

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 :(得分:0)

您可以在单引号字符串中构造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;'

答案 1 :(得分:0)

您必须反引号。首先是双引号,然后是单引号:

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"