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

Bash while循环中JSON参数变量替换失效的问题咨询

问题:Bash脚本中curl的JSON参数无法正确传递变量值

你的脚本核心问题出在Bash的单引号变量解析规则上——单引号包裹的内容会被当作完全的字面量,$line变量根本没被替换成实际的仓库名,导致API收到的name参数值就是字符串$line,自然无法识别。

修正方案1:转义双引号并使用双引号包裹JSON

把包裹JSON的单引号改成双引号,同时对JSON内部的双引号进行转义(用\"),这样Bash会正确解析$line变量,同时保证JSON格式合法:

while read -r line; do 
  curl -X POST \
    -u JLCarveth \
    -H "Content-Type: application/json" \
    -H "Authorization: token [...]" \
    -H "Accept: application/json" \
    https://myurl.com/api/v1/user/repos \
    -d "{\"name\":\"$line\"}"; 
  printf "Done $line\n"; 
done < repo_names.txt

修正方案2:使用Here文档避免转义(更易读)

如果觉得转义双引号麻烦,可以用Here文档给curl提供数据,这种写法可读性更强,也不需要转义内部双引号:

while read -r line; do 
  curl -X POST \
    -u JLCarveth \
    -H "Content-Type: application/json" \
    -H "Authorization: token [...]" \
    -H "Accept: application/json" \
    https://myurl.com/api/v1/user/repos \
    -d @- <<EOF
{"name":"$line"}
EOF
  printf "Done $line\n"; 
done < repo_names.txt

这里-d @-表示让curl从标准输入读取POST数据,<<EOF到EOF之间的内容就是传递给API的JSON,$line会被正常替换。

额外注意事项

  1. 先测试变量替换结果:可以先把curl命令换成echo "{\"name\":\"$line\"}",执行脚本确认输出的JSON格式是否正确,再实际调用API;
  2. 处理特殊字符:如果repo_names.txt里的仓库名包含双引号、反斜杠等特殊字符,需要提前对变量进行转义(比如用jq工具来生成合法的JSON),避免破坏JSON结构;
  3. 错误处理:可以添加curl的返回码检查,比如if [ $? -ne 0 ]; then echo "Failed to create $line"; fi,方便排查创建失败的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:37:40