Bash中Curl请求保留换行符:无需临时文件的解决方案
解决不带临时文件传递带换行符的curl payload问题
你的需求是避免写入临时文件,直接传递包含换行符的payload给curl,问题出在没有沿用原脚本的--data-binary参数,以及部分传递方式的语法/逻辑错误。以下是几种可行的解决方案:
方案1:直接用--data-binary传递变量
原脚本用--data-binary @tmp.json读取文件,它会严格保留文件中的所有字符(包括换行符)。直接把变量传给--data-binary即可,不需要临时文件:
payload='{"index":{}}'$'\n''{"name":"Samuel"}' curl -X POST "http://my.api.com/" \ -H "Content-Type: application/json" \ --data-binary "$payload"
这个方法最直接,变量中的换行符会被完整保留,和写入文件的效果完全一致。
方案2:通过标准输入传递(Here字符串)
用@-让curl读取标准输入,配合bash的Here字符串<<<传递payload变量:
payload='{"index":{}}'$'\n''{"name":"Samuel"}' curl -X POST "http://my.api.com/" \ -H "Content-Type: application/json" \ --data-binary @- <<< "$payload"
<<< "$payload"会把变量内容(包含换行)直接传给curl的标准输入,--data-binary @-负责读取并发送,同样保留原始换行。
方案3:进程替换(避免额外换行)
如果用进程替换,注意要给echo加-n参数,防止echo自动追加额外的换行符(这会导致payload多一行空内容,触发API语法错误):
payload='{"index":{}}'$'\n''{"name":"Samuel"}' curl -X POST "http://my.api.com/" \ -H "Content-Type: application/json" \ --data-binary @<(echo -n "$payload")
为什么之前的尝试失败?
- 用
--data "$payload":--data会自动对数据做URL编码处理,包括将换行符转换为%0D%0A,破坏了bulk API要求的每行独立JSON的格式。 - 用
--data @- << echo "$payload":语法错误,Here文档的正确写法是<<< "$payload"或者<< EOF加内容,你这种写法会把echo "$payload"当作字符串传递,而非执行命令输出。 - 用
--data \$payload``:命令替换会把变量中的换行符和空格当作分隔符,将payload拆分成多个参数,完全破坏了JSON结构。
内容的提问来源于stack exchange,提问作者learningtech
相关产品推荐
相关产品推荐

