单引号内双引号内的单引号

时间:2016-08-10 14:25:19

标签: bash quoting

我发出了一个理想情况下看起来像这样的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

单词中的单引号导致此失败。但是,我不确定如何逃避此引用,因为有几个级别的嵌套引号。

作为第二个问题,如果文本字符串中有双引号怎么办?怎么可能逃脱?

我已阅读有关逃避并查看其他SO帖子(包括How to escape single-quotes within single-quoted strings?),但我似乎无法获得任何解决方案。链接的帖子谈论单引号中的单引号,并通过使用双引号解决该问题。但是,我的单引号已经是双引号。所以这更复杂。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:3)

一个简单的建议:当有疑问并且没有特殊需求迫使你使用单引号和双引号时,只需将引号规范化并逃避内部引号:

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

答案 1 :(得分:3)

没有任何转义等,您可以使用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从stdin中读取数据。