Bash 在替代中保护背蜱

Bash 在替代中保护背蜱,bash,scripting,Bash,Scripting,我有一个自定义的mysql备份脚本,该脚本的一部分应该执行这样的语句(打算删除.gz): 但它不起作用并产生错误: 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 '-db' at line 1 我知道问题在于分隔te

我有一个自定义的mysql备份脚本,该脚本的一部分应该执行这样的语句(打算删除.gz):

但它不起作用并产生错误:

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 '-db' at line 1
我知道问题在于分隔test和db的连字符“-”

这句话很管用

mysql -uroot -pmypass -e "CREATE DATABASE IF NOT EXISTS \`test-db.gz\`"

那么,如何让上面的语句工作,包括我需要的命令替换

这背后的原因是mysql不允许您使用包含连字符的名称创建数据库。解决方法是用在MYSQL中具有特殊意义的反勾号括住DB名称,以转义保留字

Backticks在用于命令替换的shell中还有另一种含义,因此在这种情况下,我们需要对命令或嵌套Backticks使用$()符号,我个人更喜欢前者,因为前者更具可读性,而且由于Backticks在2013年被弃用,而使用$()语法

我设法重现了您所面临的问题,下面的命令对我来说很好。在这里,我们将转义backticks,这样shell就不会将它们解释为命令替换,而mysql将仍然使用它们作为指示符来转义“test db”中的“-”

但是,如果以后需要删除该数据库或对其执行任何数据库级操作,则需要用反勾号括住数据库名称,例如

drop database `test-db`;

以下是mysql中的一个bug,它与数据库名中包含连字符有关,其原因是mysql不允许您创建包含连字符的数据库。解决方法是用在MYSQL中具有特殊意义的反勾号括住DB名称,以转义保留字

Backticks在用于命令替换的shell中还有另一种含义,因此在这种情况下,我们需要对命令或嵌套Backticks使用$()符号,我个人更喜欢前者,因为前者更具可读性,而且由于Backticks在2013年被弃用,而使用$()语法

我设法重现了您所面临的问题,下面的命令对我来说很好。在这里,我们将转义backticks,这样shell就不会将它们解释为命令替换,而mysql将仍然使用它们作为指示符来转义“test db”中的“-”

但是,如果以后需要删除该数据库或对其执行任何数据库级操作,则需要用反勾号括住数据库名称,例如

drop database `test-db`;

下面是mysql中的一个bug的一个例子,它与数据库名中有连字符有关

我是否正确地将数据库名用单引号括起来?现在无法亲自测试是的,没错,除了它的反勾号“不是单引号”。我自己也试过了,效果不错。其目的是转义名称中的任何保留字,在本例中为“-”。对于drop语句,如果您省略了反勾号,它将给您带来与最初相同的错误。如果它确实对您有效,请您接受答案,使其对与您面临相同问题的人更为明显。按预期工作,无论是第一种方式还是第二种方式都很好。非常感谢哈斯!我是否也可以用单引号括起数据库名称?现在无法亲自测试是的,没错,除了它的反勾号“不是单引号”。我自己也试过了,效果不错。其目的是转义名称中的任何保留字,在本例中为“-”。对于drop语句,如果您省略了反勾号,它将给您带来与最初相同的错误。如果它确实对您有效,请您接受答案,使其对与您面临相同问题的人更为明显。按预期工作,无论是第一种方式还是第二种方式都很好。非常感谢哈斯!
mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS \``basename -s .gz test-db.gz`\`"
drop database `test-db`;