在单引号内的双引号中转义单引号

4
我正在发出一个curl命令,它的理想格式应该是这样的(请注意,由于缺乏转义而导致以下命令不正确):
curl -X POST --data-urlencode 'payload={"channel": "@somebody", "text": "I'm sending you a test message. Let me know if you get it."}' https://hooks.slack.com/services/XXX

"I'm"这个词中的单引号会导致它无法正常工作。然而,我不确定如何转义该引号,因为存在多层嵌套引号。
作为第二个问题,如果文本字符串中有双引号,应该如何转义这些引号?
我已经阅读了关于转义的内容并查看了其他SO帖子(包括如何在单引号字符串内转义单引号?),但似乎没有任何解决方案可行。链接的帖子讨论了单引号和单引号中的单引号,并通过使用双引号来解决该问题。但是,我的单引号已经在双引号中。所以这更加复杂。
非常感谢您的帮助。

1
@user000001 我编辑了我的帖子,解释了为什么那篇帖子不能解决我的问题。 - Alex Parker
只需使用 ANSI C 字符串 $'stuff' 并在其中转义单引号即可。 - 123
@Alex:关于编辑,没有区别。就bash而言,在单引号内部的双引号只是另一个字符。所以像这样的东西应该可以工作:curl -X POST --data-urlencode 'payload={"channel": "@somebody", "text": "I'\''m sending you a test message. Let me know if you get it."}' https://hooks.slack.com/services/XXX - user000001
2个回答

7

一个简单的建议:当你不确定并且没有特殊需求要求你同时使用单引号和双引号时,只需规范化引号并转义内部引号:

curl -X POST --data-urlencode "payload={\"channel\": \"@somebody\", \"text\": \"I'm sending you a test message. Let me know if you get it.\"}" https://hooks.slack.com/services/XXX

它更加简洁和直观。

如果你想在双引号内真正避免单引号:

 curl -X POST --data-urlencode 'payload={"channel": "@somebody", "text": "I'\''m sending you a test message. Let me know if you get it."}' https://hooks.slack.com/services/XXX

6

您可以使用 here-doc,而不需要任何转义等操作,并将其传递给您的 curl 命令:

cat<<-'EOF' | curl -X POST --data-urlencode @- https://hooks.slack.com/services/XXX
payload={"channel": "@somebody", "text": "I'm sending you a test message. Let me know if you get it."}
EOF 

在这里,@-将使curl从标准输入读取数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接