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

