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

问题描述 投票:0回答:3

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

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

错误总是:

% /usr/bin/sh -c "ls 1\`"
Unmatched `
shell quotes quoting backticks
3个回答
71
投票

您需要转义反引号,但也需要转义反斜杠:

$触摸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'\`'"
无与伦比的`。

我强烈建议您首先避免使用此类文件名。


6
投票

使用单引号代替:

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

1
投票
/usr/bin/sh -c "ls '1\`'"
© www.soinside.com 2019 - 2024. All rights reserved.