繁体   English   中英

在bash中转义变量

[英]Escaping variables in bash

我有以下代码通过命令行创建mysql数据库

dbcommand="create database $dbname;GRANT ALL PRIVILEGES ON $dbname.* TO $dbuser@localhost IDENTIFIED BY '$dbpassw';FLUSH PRIVILEGES;"
mysql -u root -p$pass -e "$dbcommand"

它在大多数情况下都可以正常工作,但是如果$ dbname / $ dbuser由诸如破折号( - )之类的特殊字符组成,则$dbcommand失败。

我如何修复即使有特殊字符也能正常工作

在mysql中,只有ASCII:[0-9,az,AZ $ _](基本拉丁字母,数字0-9,美元,下划线)可以包含在未加引号的数据库名称中。 请参阅: 9.2模式对象名称带 引号的标识符中允许的字符包括完整的Unicode基本多语言平面(BMP),但U + 0000除外。 ID。 标识符引号是反引号 (“`”)。 ID。 因此,在您的情况下,您需要:

dbcommand="create database \`$dbname\`;GRANT ALL PRIVILEGES ON \`$dbname\`.* TO $dbuser@localhost IDENTIFIED BY '$dbpassw';FLUSH PRIVILEGES;"
mysql -u root -p${pass} -Be "$dbcommand"

如果由于某些原因\\字符在分配给dbcommand被剥离,则使用:

mysql -u root -p${pass} -Be "create database \`$dbname\`;GRANT ALL PRIVILEGES ON \`$dbname\`.* TO $dbuser@localhost IDENTIFIED BY '$dbpassw';FLUSH PRIVILEGES;"

例:

$ mysql -Be "create database \`myblog-wp\`;"
$ mysql -Be "show databases;"
Database
information_schema
mmedia
myblog-wp
mysql
performance_schema

注意:在bash中,必须用\\转义反引号,以防止反引号被视为命令执行请求。 如果是我,我将命名为数据库weblogwp ,而不必担心反引号:)

暂无
暂无

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

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