我喜欢将我的连接和常规转储设置放入变量中,然后将它们提供给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
选项附近有一堆额外的单引号... 如何?
答案 0 :(得分:1)
您的第一个命令与可能与bash变量一起使用的版本之间存在显着差异。
当您运行第一个代码块中的命令时,双引号将由bash本身解释,并且内容作为单个参数发送给命令。
在bash变量中,您显式插入文字引号。使bash以你想要的方式解析的唯一方法是eval
命令,因为它在引号内和它们之外包含空格。
在bash中执行此操作的最简单方法是避免在命令中使用此类嵌套变量。在您的情况下,请不要在运行命令之前创建SRC_SQL_OPT
。或者至少,不要包含--where
- 部分。