如何在bash中转义mysqldump引号?
问题描述:
我需要使用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'""
有没有说我不理解有关报价逃避些什么呢?
答
变量保存数据,而不是代码。改为定义一个函数。
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
答
尝试使用'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
如果你不注入变量,我看不出使用双引号字符串的好处。 –