转义 shell 的单引号

Escaping single quotes for shell

我正在将带有 JSON 的 ENV 传递给 Docker。我需要在 shell 上使用一个字符串作为参数。在 shell 中,转义单引号的正确方法是使用 '\''。因此,"Tom's Market" 变为 "Tom'\''s Market",如:

docker run -it -e FOO='["Tom'\''s Market"]' ...

Ruby 的 Shellwords 似乎没有这样做。

Shellwords.shellescape('["Tom\'s Market"]')
#=> \[\"Tom\'s\ Market\"\]

所以我想使用简单的 find/replace:

'["Tom\'s Market"]'.gsub("'", "'\''")
#=> ["Tom's Market"]'s Market"]

我不知道那里发生了什么。有人可以帮助我吗?

好吧,反斜杠是您在 ruby 字符串中转义的方式。要转义它,您需要另一个反斜杠。

通常是添加反斜杠直到它起作用

puts %q{["Tom's Market"]}.gsub("'", "'\\''")
# ["Tom'\''s Market"]

Shellwords.escape's result is meant to be used unquoted:

docker run -it -e FOO=\[\"Tom\'s\ Market\"\]