2016-12-05 46 views
0

我需要使用mysqldump工具备份我的数据库。 我的测试表有一个我必须用作过滤器的TIMESTAMP列。 我使用的是bash脚本用下面的代码:如何在bash中转义mysqldump引号?

#!/bin/bash 
cmd="mysqldump --verbose --opt --extended-insert --result-file /home/backups/mysql/test/test_table.20161205.bak test --where=\"timestamp_c>='2016-12-03 00:00:00'\" --tables \"test_table\"" 
echo $cmd 
$cmd 

我打印的,我认为应该工作的命令。上面的脚本产生的输出:

mysqldump --verbose --opt --extended-insert --result-file /home/backups/mysql/test/test_table.20161205.bak test --where="timestamp_c>='2016-12-03 00:00:00'" --tables "test_table" 

如果我在终端上复制打印的命令,它的工作; 然而,在脚本的命令打印错误:

mysqldump: Couldn't find table: "00:00:00'"" 

有没有说我不理解有关报价逃避些什么呢?

+0

如果你不注入变量,我看不出使用双引号字符串的好处。 –

回答

2

变量保存数据,而不是代码。改为定义一个函数。

cmd() { 
    mysqldump --verbose --opt --extended-insert \ 
      --result-file /home/backups/mysql/test/test_table.20161205.bak test \ 
      --where="timestamp_c>='2016-12-03 00:00:00'" \ 
      --tables "test_table" 
} 
+0

这种方法工作正常,避免了'eval'允许的脏代码。 – Takumi

-1

尝试使用'eval'执行您的命令。例如:

#!/bin/bash 
cmd="mysqldump --verbose --opt --extended-insert --result-file /home/backups/mysql/test/test_table.20161205.bak test --where=\"timestamp_c>='2016-12-03 00:00:00'\" --tables \"test_table\"" 
eval $cmd 
+0

不会'eval'评估字符串的值,然后执行它?我无法看到downvote的原因。请提供解释。 – yogur

+0

变量并不意味着包含代码。我们可以使用一个函数来代替。 – andlrc

+0

@andlrc这是真的,我仍然只是提出了Takumi的具体问题的答案。 – yogur