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

Ruby中如何将变量替换到转义Shell字符串并处理JSON链接?

解决Ruby与Shell转义冲突:在curl的JSON payload中插入Ruby变量

这个问题的核心在于Ruby字符串插值、JSON格式要求、Shell命令解析三者的转义规则冲突——你手动拼接JSON时,HTML链接里的双引号没有正确转义,导致Shell解析curl的-d参数时破坏了JSON结构。下面给你两种可靠的解决方案:

方案1:用Ruby的JSON库自动生成Payload(推荐)

手动拼接JSON很容易出错,尤其是嵌套HTML的时候。Ruby的json标准库可以帮你自动处理所有转义,完全避免手动转义的麻烦:

require 'json'

# 先构建Ruby哈希结构,直接插入变量
question_hash = {
  question: {
    question_type: "multiple_choice_question",
    question_text: "<p>Is everything clear?</p>",
    points_possible: 1,
    answers: [
      {
        text: "I read and understood",
        html: "",
        weight: 100
      },
      {
        text: "I have questions",
        comments_html: "<p>Please post your questions to a <a href=\"#{CANVAS_URI}/courses/#{COURSE_ID}/discussion_topics\">discussion</a>.</p>",
        weight: 0
      }
    ]
  }
}

# 把哈希转成合法的JSON字符串,自动处理所有转义
json_payload = JSON.generate(question_hash)

# 执行curl命令,用Shell单引号包裹JSON,防止Shell解析里面的双引号
`curl -s "#{CANVAS_URI}/api/v1/courses/#{COURSE_ID}/quizzes/#{quiz_id}/questions" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '#{json_payload}' \
  -H "Authorization: Bearer #{CANVAS_TOKEN}"`

为什么这个方法有效?

  • JSON.generate会自动把HTML链接里的双引号转义成\",生成完全符合JSON规范的字符串。
  • 用Shell的单引号'包裹-d的参数,Shell会把单引号内的内容当作字面量,不会解析里面的双引号和特殊字符,完美避免转义冲突。

方案2:手动转义嵌套双引号(不推荐,仅作参考)

如果你坚持手动拼接JSON字符串,需要在Ruby里把HTML链接的双引号转义两次:一次是Ruby字符串的转义,一次是JSON的转义。具体来说,就是把href="..."改成href=\\"..."\\",这样Ruby插值后会生成href=\"...\",符合JSON格式:

myJson = %Q|{ "question": { "question_type": "multiple_choice_question", "question_text": "<p>Is everything clear?</p>", "points_possible": 1, "answers": [ { "text": "I read and understood", "html": "", "weight": 100 }, { "text": "I have questions", "comments_html": "<p>Please post your questions to a <a href=\\"#{CANVAS_URI}/courses/#{COURSE_ID}/discussion_topics\\">discussion</a>.</p>", "weight": 0 } ] } }|

# 执行curl时同样用单引号包裹payload
`curl -s "#{CANVAS_URI}/api/v1/courses/#{COURSE_ID}/quizzes/#{quiz_id}/questions" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '#{myJson}' \
  -H "Authorization: Bearer #{CANVAS_TOKEN}"`

为什么之前的修改失败?

你之前的代码里,HTML链接的href="#{...}"没有转义,导致生成的JSON中comments_html字段出现未转义的双引号,破坏了JSON结构。Shell解析-d "#{myJson}"时,会把这些双引号当作Shell字符串的边界,导致curl收到的payload不完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:55:07