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

