繁体   English   中英

Shell 脚本:使用 shell 变量启动 Mysql 脚本

[英]Shell script: Launch Mysql script using shell variable

我在从 shell 启动 MySQL 脚本时遇到问题。 我使用文件名为我的变量${x}赋值。 所以我必须使用这个变量启动一个 MySQL 脚本。 我想启动脚本而不在 shell 中插入所有 MySQL 代码(太长)但使用:

mysql -h localhost -uuser -ppsw DB < script.sql

我的试探是:

mysql -h localhost -uuser -ppsw DB -e "set @x=${x}; source script.sql"

mysql -h localhost -uuser -ppsw DB -e "set @x=${x};"
mysql -h localhost -uuser -ppsw DB< script.sql

但不适合我。 你可以帮帮我吗?

我很惊讶您的第一个解决方案不起作用:

mysql -h localhost -uuser -ppsw DB -e "set @x=${x}; source script.sql"

分析

  • source是一个MySQL 命令
  • set @x=${x}; 是一条 SQL 语句。

我认为可能存在将两种类型组合为一个语句作为 MySQL --execute=statement, -e statement应该执行该语句并退出的问题。

和退出部分是当我尝试我的第一个想法时忽略重定向的标准输入的原因:

mysql -h localhost -uuser -ppsw DB -e "set @x=${x};" < script.sql

解决方案

经过进一步的实验,我发现只需在source命令后附加一个分号就可以防止语法错误。 我不能说为什么这会起作用,因为通常不需要分号来终止列表的最后一个 SQL 语句,但是你有它:

mysql -h localhost -uuser -ppsw DB -e "set @x=${x}; source script.sql;"

正如 Glenn Jackman 指出的,如果 shell 变量是一个非数字字符串,shell 变量必须用单引号括起来,这样当 MySQL 变量被赋值时,MySQL 将处理右侧(shell 变量)作为字符串文字而不是作为列名的标识符:

mysql -h localhost -uuser -ppsw DB -e "set @x='$x'; source script.sql;"

这个版本也可以安全地处理数字字符串,如下面的例子所示。 我还删除了 shell 变量周围的花括号,因为它们不是必需的。

例子

t.sql内容:

select now();
select @variable as 'Contents of variable';

使用数字字符串作为 shell 变量:

$ number=3
$ mysql -e "set @variable=$number; source t.sql;"
+---------------------+
| now()               |
+---------------------+
| 2015-10-02 13:06:45 |
+---------------------+
+----------------------+
| Contents of variable |
+----------------------+
| 3                    |
+----------------------+

使用非数字字符串作为 shell 变量生成错误:

$ text=text
$ mysql -e "set @variable=$text; source t.sql;"
ERROR 1054 (42S22) at line 1: Unknown column 'text' in 'field list'

$ text="This is a string"
$ mysql -e "set @variable=$text; source t.sql;"
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a string' at line 1

现在将 shell 变量用单引号括起来:

$ mysql -e "set @variable='$text'; source t.sql;"
+---------------------+
| now()               |
+---------------------+
| 2015-10-02 13:08:04 |
+---------------------+
+----------------------+
| Contents of variable |
+----------------------+
| This is a string     |
+----------------------+

$ text=text
$ mysql -e "set @variable='$text'; source t.sql;"
+---------------------+
| now()               |
+---------------------+
| 2015-10-02 13:10:53 |
+---------------------+
+----------------------+
| Contents of variable |
+----------------------+
| text                 |
+----------------------+

$ mysql -e "set @variable='$number'; source t.sql;"
+---------------------+
| now()               |
+---------------------+
| 2015-10-02 13:11:42 |
+---------------------+
+----------------------+
| Contents of variable |
+----------------------+
| 3                    |
+----------------------+

使用不存在的 shell 变量会将 MySQL 变量设置为空字符串:

$ mysql -e "set @variable='$nonexistent'; source t.sql;"
+---------------------+
| now()               |
+---------------------+
| 2015-10-02 13:06:14 |
+---------------------+
+----------------------+
| Contents of variable |
+----------------------+
|                      |
+----------------------+

暂无
暂无

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

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