繁体   English   中英

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

[英]How do I best use a declared variable in bash in mysql command?

我正在编写一个用于自动安装和配置系统的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密码不变。

感谢您的阅读。

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

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

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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM