在 shell 中的双引号字符串中转义反引号

Posted

技术标签:

【中文标题】在 shell 中的双引号字符串中转义反引号【英文标题】:Escape backquote in a double-quoted string in shell 【发布时间】:2010-12-21 21:40:24 【问题描述】:

对于命令:/usr/bin/sh -c "ls 1`"(1 后的反引号)。

如何让它成功运行?在“`”之前添加反斜杠不起作用。 ` 是我们知道的一个特殊字符,我也尝试用单引号将它括起来(/usr/bin/sh -c "ls 1'`'"),但这也不起作用。

错误总是:

% /usr/bin/sh -c "ls 1\`"
Unmatched `

【问题讨论】:

你有一个反引号吗? 1` 是文件名吗? 是的,实际上我可以创建一个名为“1" by issuing command "touch 1”的文件,但是shell无法在双引号内解析它 【参考方案1】:

你需要转义反引号,还要转义反斜杠:

$触摸1\` $ /bin/sh -c "ls 1\\\`" 1`

您必须“两次”转义它的原因是因为您在一个解释双引号字符串一次的环境(例如 shell 脚本)中输入此命令。然后它被子shell再次解释。

您也可以避免使用双引号,从而避免第一种解释:

$ /bin/sh -c 'ls 1\`' 1`

另一种方法是将文件名存储在变量中,并使用该值:

$ 出口 F='1`' $ printenv F 1` $ /bin/sh -c 'ls $F' # 注意 /bin/sh 解释的是 $F,而不是我当前的 shell 1`

最后,您所尝试的将适用于某些 shell(我使用的是 bash,如上面的示例),但显然不适用于您的 shell:

$ /bin/sh -c "ls 1'\`'" 1` $ csh #进入csh,下一行在那个环境下执行 % /bin/sh -c "ls 1'\`'" 无与伦比的`。

我强烈建议您避免在 first place 中使用此类文件名。

【讨论】:

【参考方案2】:

改用单引号:

/usr/bin/sh -c 'ls 1\`'

【讨论】:

【参考方案3】:
 /usr/bin/sh -c "ls '1\`'"

【讨论】:

以上是关于在 shell 中的双引号字符串中转义反引号的主要内容,如果未能解决你的问题,请参考以下文章

将python中的双引号shell命令传递给subprocess.Popen()?

shell中单引号怎么转义

PHP中的双引号和单引号的应用

单引号字符串中的双引号 - NodeJs

vb去掉字符串中的双引号

vba 如何去掉返回结果两端的双引号?