嵌套变量的奇数bash行为

时间:2016-08-15 09:04:36

标签: mysql bash

我喜欢将我的连接和常规转储设置放入变量中,然后将它们提供给mysqldump,如下所示:

# echo mysqldump ${SRC_SRV} ${SRC_SQL_OPT}
mysqldump -u root -pPass -h host --where="COL > '2016-08-14' AND COL <= '2016-08-15'" --opt --single-transaction --skip-triggers --no-create-db --no-create-info dbase table

我的bash个变量:

WHERE="COL > '2016-08-14' AND COL <= '2016-08-15'"
SRC_SQL_OPT="--where=\"${WHERE}\" --opt --single-transaction --skip-triggers --no-create-db --no-create-info ${DB} ${TBL}"

请注意,当我echo时 - 一切看起来都很正常,但如果我尝试在bash中运行它,我会收到错误:

mysqldump: Got error: 1049: Unknown database '>' when selecting the database

这就是为什么(bash -x):

的原因
+ mysqldump -u root -pPass -h host '--where="COL' '>' ''\''2016-08-14'\''' AND COL '<=' ''\''2016-08-15'\''"' --opt --single-transaction --skip-triggers --no-create-db --no-create-info dbase table

注意:现在--where选项附近有一堆额外的单引号... 如何

1 个答案:

答案 0 :(得分:1)

您的第一个命令与可能与bash变量一起使用的版本之间存在显着差异。

当您运行第一个代码块中的命令时,双引号将由bash本身解释,并且内容作为单个参数发送给命令。

在bash变量中,您显式插入文字引号。使bash以你想要的方式解析的唯一方法是eval命令,因为它在引号内和它们之外包含空格。

在bash中执行此操作的最简单方法是避免在命令中使用此类嵌套变量。在您的情况下,请不要在运行命令之前创建SRC_SQL_OPT。或者至少,不要包含--where - 部分。