curl | jq解析报错:行2列0无效数字字面量,请求排查解决
问题分析与解决方案
你遇到的parse error: Invalid numeric literal错误,主要是两个核心问题加上潜在的变量问题导致的,咱们一步步拆解:
错误原因
- 脚本语法严重错误:你的
#!/bin/bash声明后没有换行,直接跟了net=$(...)命令。这会让系统把后续所有内容都当成bash解释器的启动参数,而不是脚本里要执行的命令——相当于你直接跑了/bin/bash net=$(curl...),这完全不符合脚本逻辑,自然会导致curl请求没有正确发送,返回的不是预期的JSON数据,jq解析无效内容时就会抛出错误。 - 多余且破坏性的awk处理:就算修复了换行问题,你加的
awk '/id/{print $1}'也是画蛇添足。curl返回的是单行完整JSON,awk默认按空格分割字段,整个JSON是一个无空格的字符串,所以print $1虽然看起来是整个JSON,但如果curl返回的是错误信息(比如token无效),这步处理会让jq拿到不完整的内容,直接触发解析错误。 - 潜在的token变量问题:如果
$token没有正确赋值(比如为空、包含换行或特殊字符),curl发送的请求会被服务器拒绝,返回的是错误文本而非JSON,jq解析时同样会报错。
修复方案
基础版(最简正确脚本)
先把脚本的语法问题修复,去掉多余的awk,直接用jq解析完整JSON:
#!/bin/bash # 请确保token变量已正确赋值(可以从环境变量读取,或在此处手动设置) # 示例:token="your_valid_auth_token_here" # 发送请求并提取network.id net=$(curl -s -H "Content-Type: application/json" \ -H "X-Auth-Token: $token" \ -d '{"network": {"name": "net1"}}' \ http://10.1.10.146:18090/network/v2.0/networks 2>&1 | jq -r '.network.id') echo "$net"
健壮版(带错误检查)
如果需要排查问题更方便,可以添加token检查和响应验证,避免因为无效请求导致的模糊错误:
#!/bin/bash # 先检查token是否已设置 if [ -z "${token}" ]; then echo "Error: 未设置X-Auth-Token变量,请先赋值" exit 1 fi # 发送请求并完整捕获响应 response=$(curl -s -H "Content-Type: application/json" \ -H "X-Auth-Token: $token" \ -d '{"network": {"name": "net1"}}' \ http://10.1.10.146:18090/network/v2.0/networks 2>&1) # 尝试解析JSON,隐藏jq的错误输出 network_id=$(echo "$response" | jq -r '.network.id' 2>/dev/null) # 判断解析是否成功 if [ -n "${network_id}" ] && [ "${network_id}" != "null" ]; then echo "成功获取网络ID: ${network_id}" else echo "错误:无法解析网络ID,服务器响应内容如下:" echo "$response" exit 1 fi
验证步骤
- 先单独测试curl命令,确保返回的是你提供的完整JSON:
curl -s -H "Content-Type: application/json" -H "X-Auth-Token: $token" -d '{"network": {"name": "net1"}}' http://10.1.10.146:18090/network/v2.0/networks - 确认token变量的值正确,可以用
echo $token查看。 - 运行修复后的脚本,应该能正常输出网络ID。
内容的提问来源于stack exchange,提问作者vidyadhar reddy
相关产品推荐
相关产品推荐

