Shell脚本中curl使用变量传递payload时请求异常问题
Shell调用curl传变量报错根因
核心问题是Shell词法解析规则和你肉眼看到的字符串输出逻辑不一致,你打印出来的命令相同不代表实际传给curl的参数相同,两个具体问题点如下:
- 未加双引号包裹的变量展开会触发单词拆分
你写的--data-raw $payload属于典型的变量展开未加引号场景,Shell会把$payload的内容按空白字符(空格、制表符、换行)拆成多个独立参数传给curl。你的payload值{"deployed": true}里包含一个空格,拆分后实际传给curl的是两个独立参数:{"deployed":和true},curl拿到的请求体是不完整的,自然报错。
你用echo打印命令时,echo会自动把多个入参用空格拼接成字符串输出,肉眼看不到参数拆分的边界,才会误以为命令和硬编码版本完全一致。如果开set -x打印Shell执行的真实参数列表,就能清晰看到拆分后的参数结构。 - 现有写法的Header参数存在引号嵌套错误
你写的--header "'Content-Type: application/json'"会把带单引号的字符串'Content-Type: application/json'传给curl,最终发送给服务端的Header值是多余单引号的,不符合HTTP规范。硬编码版本能拿到预期响应,纯粹是目标服务做了容错兼容,本身属于错误写法。
正确可复现的写法
所有带特殊字符、空格的参数,以及变量展开,统一用双引号包裹,去掉Header里多余的嵌套单引号:
payload='{"deployed": true}' curl -i -X POST "$url" \ --header "Content-Type: application/json" \ --data-raw "$payload"
内容的提问来源于stack exchange,提问作者Suraj Menon
相关产品推荐
相关产品推荐

