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