1

我想在 ruby​​ 中使用反引号进行程序调用。该参数是一个包含一个或多个反引号的字符串变量,即“&E?@@A`?”。以下命令产生一个新标签作为其返回值:

echo "&E?@@A\`?" | nauty-labelg 2>/dev/null

从 ruby​​ 程序中,我可以按如下方式调用它并获得正确的结果:

new_label = `echo "&E?@@A\\\`?" | nauty-labelg 2>/dev/null`

我想使用标签的变量来实现相同的目的。所以我必须在变量 label = "&E?@@A`?" 中插入三个斜杠。为了逃避反引号。以下似乎工作,虽然它不是很优雅:

escaped_label = label.gsub(/`/, '\\\`').gsub(/`/, '\\\`').gsub(/`/, '\\\`')

但是新变量不能在程序调用中使用:

new_label = `echo "#{escaped_label}" | nauty-labelg 2>/dev/null`

在这种情况下,我没有从 nauty-labelg 得到答案。

4

1 回答 1

0

所以我必须在变量 label = "&E?@@A`?" 中插入三个斜杠。为了逃避反引号。

不,您只需要为输出添加一个反斜杠。转义`特殊的 bash 字符。其他两个仅用于表示建议,否则它不是有效的 Ruby 代码。

new_label = `echo "&E?@@A\\\`?" | nauty-labelg 2>/dev/null`

第一个反斜杠将转义第二个反斜杠(输出一个反斜杠)。第三个反斜杠转义`字符(输出一个`)。

您应该只在双引号 bash 上下文中具有特殊含义的字符之前添加反斜杠。这些特殊字符是:$、、`和。这些可以使用以下代码进行转义:\\n

def escape_bash_string(string)
  string.gsub(/([$`"\\\n])/, '\\\\\1')
end

因为label = "&E?@@A`?"只有`应该转义。

escaped_string = escape_bash_string("&E?@@A\`?")
puts escaped_string
# &E?@@A\`?
于 2020-03-13T18:32:24.140 回答