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

如何在curl POST请求中发送请求体并正确传入shell变量

问题原因

你当前的写法无法正确传入变量,是因为 Shell 中单引号包裹的字符串会完全禁用特殊字符解析,$CONTENT_SOURCE 会被当做普通字面量传输,不会替换为实际的变量值。

解决方法

下面提供三种常用方案,按稳妥程度排序:

  • 方案1:拆分单引号做字符串拼接(适合变量内容无JSON特殊字符的场景)
    把需要插值的变量部分从单引号中拆分出来,用双引号包裹变量保证空格等特殊字符能正常处理,写法如下:

    local CONTENT_SOURCE="$1"
    
    curl "$APP_URL/api/admin/sync" \
      --header 'Content-Type: application/json' \
      --data '{"content": "'"$CONTENT_SOURCE"'", "usernames": ["abcuser@gmail.com"]}' \
      -w "\n"
    

    原理是相邻的字符串会被Shell自动拼接,'{"content": "' + "$CONTENT_SOURCE" + ", "usernames": ["abcuser@gmail.com"]}' 三段会拼接为完整的JSON字符串,同时变量会被正确解析。

  • 方案2:用双引号包裹整个请求体(适合简单场景,注意转义内部双引号)
    把整个--data参数用双引号包裹,内部的JSON双引号全部加反斜杠转义,Shell会解析双引号内部的变量:

    local CONTENT_SOURCE="$1"
    
    curl "$APP_URL/api/admin/sync" \
      --header 'Content-Type: application/json' \
      --data "{\"content\": \"$CONTENT_SOURCE\", \"usernames\": [\"abcuser@gmail.com\"]}" \
      -w "\n"
    
  • 方案3:用jq生成合法JSON(最稳妥,推荐变量内容不确定的场景)
    如果CONTENT_SOURCE可能包含双引号、换行、特殊符号,直接拼接会导致JSON格式错误,用jq工具生成标准JSON可以完全避免格式问题:

    local CONTENT_SOURCE="$1"
    # 用jq生成合法的JSON数据
    REQ_BODY=$(jq -n \
      --arg content "$CONTENT_SOURCE" \
      '{"content": $content, "usernames": ["abcuser@gmail.com"]}')
    
    curl "$APP_URL/api/admin/sync" \
      --header 'Content-Type: application/json' \
      --data "$REQ_BODY" \
      -w "\n"
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:18:00