5

我想$$在代码库中确认文字字符串:“”,但像这样转义美元符号:

ack \$\$

不起作用。

4

4 回答 4

16

您对 shell 引用感到困惑。当您键入:

ack "\\\$\\\$\("

shell 对双引号字符串进行插值,以便\\转换为\\$转换为$\(转换为\(ack 获取字符串\$\$\(作为其参数。通过使用单引号和调用来避免 shell 插值要简单得多:

ack '\$\$\('

替换ackecho探索外壳如何扩展字符串。注意

ack "\\$\\$\("

也可以,但原因略有不同。在这里,前两个\被视为单个(转义)\,然后$被翻译为 a $,因为它后面跟着一个不是变量名中有效字符的字符。 \(扩展为\(而不是仅仅(因为(不受插值影响,因此不需要转义。但请注意,在双引号之外,\(将转换为(.

Shell 引用规则有时会令人困惑!

于 2013-02-21T20:47:47.860 回答
16

使用 ack's-Q进行转义。

ack -Q '$$'
于 2013-05-16T17:22:31.140 回答
0

您可以使用三个反斜杠转义美元符号字符,如下所示:

ack "\\\$\\\$"

或使用单引号,您只需将其转义一次:

ack '\$\$'
于 2013-02-21T20:27:49.003 回答
0

您可以使用格式说明符printf为您处理引用。%q

$ printf %q '$$('
\$\$\(

help print有以下要说的(我假设这里是 bash)`

 %q quote the argument in a way that can be reused as shell input
于 2013-02-21T20:54:25.937 回答