在bash中转义变量

时间:2014-08-10 05:20:52

标签: 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会失败。

如何使用特殊字符

来修复它

1 个答案:

答案 0 :(得分:1)

在mysql中只有ASCII:[0-9,a-z,A-Z $ _](基本拉丁字母,数字0-9,美元,下划线)可以包含在数据库名称未加引号中。请参阅:9.2 Schema Object Names 引用标识符中的允许字符包括完整的Unicode基本多语言平面(BMP),但U + 0000除外。 ID。标识符引号字符是<​​strong>反引号(“`”)。 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,而不必担心反引号:)