You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby拼接含单引号字符串到curl命令报错:未终止引号字符串

解决Shell语法错误:Unterminated quoted string

你遇到的问题核心是手动拼接curl命令时,字符串里的特殊字符破坏了Shell的引号规则——尤其是当msg包含单引号时,你用\\'的转义方式并不符合Shell单引号的处理逻辑:Shell单引号内部的内容是完全字面的,没法用反斜杠转义单引号,这就导致你的-d参数里出现了未闭合的引号,触发语法错误。

下面给你几个实用的解决办法:

方法1:用Ruby的system直接传参数(最安全推荐)

别拼接完整的Shell命令字符串,把curl的每个参数拆成数组元素传给system——Ruby会直接处理参数传递,完全避开Shell的引号和转义坑,还能防止Shell注入风险:

require 'json'

msg = "john's message"
# 用JSON库生成合法的JSON,避免手动拼接出错
body = {
  body: {
    version: 1,
    type: "doc",
    content: [
      {
        type: "paragraph",
        content: [{ type: "text", text: msg }]
      }
    ]
  }
}

# 以数组形式传递参数,彻底绕开Shell引号问题
system(
  "curl",
  "-X", "POST",
  "-H", "Content-Type: application/json",
  "-H", "Authorization: Bearer xxxx",
  "-d", JSON.generate(body),
  "--url", "https://api.atlassian.com/site/xxxx/conversation/xxxx/message"
)

方法2:正确转义Shell单引号(如果一定要生成命令字符串)

如果必须生成完整的curl命令字符串,要按Shell的规则转义单引号:在单引号包裹的内容里,用'\''表示一个单引号(逻辑是:关闭当前单引号 + 转义的单引号 + 重新打开单引号)。同时记得用JSON库生成合法的JSON,避免手动拼接的格式错误:

require 'json'

msg = "john's message"
# 用JSON库生成标准JSON
body_hash = {
  body: {
    version: 1,
    type: "doc",
    content: [
      { type: "paragraph", content: [{ type: "text", text: msg }] }
    ]
  }
}
body_json = JSON.generate(body_hash)

# 按Shell规则转义单引号
escaped_body = body_json.gsub("'") { "'\\''" }
curl_call = %Q|curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Bearer xxxx' -d '#{escaped_body}' --url 'https://api.atlassian.com/site/xxxx/conversation/xxxx/message'|

puts curl_call
system(curl_call)

额外提醒:别手动拼接JSON

你之前手动用字符串拼JSON,很容易因为特殊字符(比如引号、换行)导致JSON格式非法。用Ruby标准库的JSON.generate或to_json生成JSON,既能保证格式合法,又能自动转义JSON内部的特殊字符,省心又靠谱。

内容的提问来源于stack exchange,提问作者vishless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:16:02