我使用带有 Bash 的 Ubuntu 16.04 和 MySQL Ver 14.14 Distrib 5.7.21,对于 Linux (x86_64),使用 EditLine 包装器。
我尝试直接从命令行为 webapp(WordPress)创建一个 DB 堆栈,并在此分享我所知道的最佳方法和我遇到的问题(答案可能会提供更好的方法)。
我尝试执行以下 MySQL CLI 代码,在其中创建一个授权的全特权用户 + 一个同名的数据库实例:
cat <<-EOF | mysql -u root -p"$dbrootp_1"
DROP USER IF EXISTS "$domain"@"localhost";
DROP DATABASE IF EXISTS "$domain";
CREATE USER "$domain"@"localhost" IDENTIFIED BY "$dbuserp_1";
CREATE DATABASE "$domain";
GRANT ALL PRIVILEGES ON "$domain".* TO "$domain"@"localhost";
EOF
执行输出以下错误:
ERROR 1064 (42000) at line 2:您的 SQL 语法有错误;
检查与您的 MySQL 服务器版本对应的手册,了解在第 1 行“example.com”附近使用的正确语法
我对这个错误感到困惑:问题是在第 1 行还是第 2 行?这里的语法错误是什么?我必须使用变量扩展。
根据答案更新
用户l0b0,我尝试使用您所展示的${x}
替代方法"$x"
,但遗憾的是它输出了错误:
ERROR 1064 (42000) at line 1:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行“-law.co.il@localhost”附近使用的正确语法。
不将数据通过管道传输到 mysql 的 cat 输出:
DROP USER IF EXISTS example.com@localhost;
DROP DATABASE IF EXISTS example.com;
CREATE USER example.com@localhost IDENTIFIED BY MYPASSWORD;
CREATE DATABASE example.com;
GRANT ALL PRIVILEGES ON example.com.* TO example.com@localhost;
答案1
正如@jordanm 指出的那样,这里的文件引号是字面意思,而不是语法。所以你要
mysql -u root -p"$dbrootp_1" <<-EOF
DROP USER IF EXISTS ${domain}@localhost;
DROP DATABASE IF EXISTS ${domain};
CREATE USER ${domain}@localhost IDENTIFIED BY ${dbuserp_1};
CREATE DATABASE ${domain};
GRANT ALL PRIVILEGES ON ${domain}.* TO ${domain}@localhost;
EOF
如果您的$domain
或中包含特殊字符,则$dbuserp_1
需要在中引用它们反引号:
mysql -u root -p"$dbrootp_1" <<-EOF
DROP USER IF EXISTS \`${domain}\`@localhost;
DROP DATABASE IF EXISTS \`${domain}\`;
CREATE USER \`${domain}\`@localhost IDENTIFIED BY \`${dbuserp_1}\`;
CREATE DATABASE `${domain}`;
GRANT ALL PRIVILEGES ON \`${domain}\`.* TO \`${domain}\`@localhost;
EOF