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
相关产品推荐
相关产品推荐

