[英]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.