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

Bash多行变量自动添加额外单引号问题及curl传参异常

解决Shell脚本中curl传递JSON变量的异常问题

你遇到的核心问题是未对$user_login_json变量添加双引号,导致Bash在处理变量时触发了「分词(word splitting)」行为:JSON里的空格、换行被当作参数分隔符,curl收到的不是完整的JSON对象,而是被拆碎的零散片段,自然会让JSON-RPC请求失败。

修复后的代码(保留中间变量写法)

get_auth_token() {
    user_login_json=$(cat <<- EOF
    { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "$user", "password": "$pword" }, "auth": null, "id": 0 }
EOF
    )
    # 关键:给变量加上双引号,确保整个JSON作为单一参数传递
    auth_token_json=$(curl --silent -X POST -H 'Content-type:application/json' --data "$user_login_json" "$api_endpoint")
}

双引号会告诉Bash把变量内容当作一个完整字符串处理,不会进行分词和文件名扩展,这样curl就能收到格式正确的JSON数据。

更简洁的优化写法(省去中间变量)

可以直接将heredoc内容传给curl的标准输入,避免变量处理的额外风险:

get_auth_token() {
    auth_token_json=$(curl --silent -X POST -H 'Content-type:application/json' --data @- "$api_endpoint" <<- EOF
    { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "$user", "password": "$pword" }, "auth": null, "id": 0 }
EOF
    )
}

这里的--data @-表示curl从标准输入读取数据,我们直接把heredoc作为输入源,既精简了代码,也减少了出错概率。

额外注意点

如果你的缩进用的是空格而非制表符(Tab),建议去掉<<-中的减号(改用<< EOF),因为<<-只会忽略行首的制表符,空格会被保留并混入JSON中,可能引发格式错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:08:12