如何在Shell脚本中从curl响应提取数组并遍历键值对?
将curl响应中的交易数据存入Shell数组并遍历
1. 修正jq命令的拼写错误
你当前的jq命令存在拼写错误:tansaction应为transaction,这是正确提取数据的前提。
2. 调整jq输出格式,适配Shell数组
要让输出能被Shell安全读取为数组,需将每个[timestamp, value]对单独输出一行,并通过@sh过滤器自动处理特殊字符和引号,避免解析错误:
curl "$url" | jq -r '.data[].data.transaction[] | @sh'
该命令会输出类似以下格式的结果:
'timestamp1' 'value1' 'timestamp2' 'value2' 'timestamp3' 'value3' 'timestamp4' 'value4'
3. 将输出存入Shell数组
使用bash内置的mapfile(或等价的readarray)命令,把jq的输出直接存入数组,-t参数会自动去除每行末尾的换行符:
mapfile -t transactions < <(curl "$url" | jq -r '.data[].data.transaction[] | @sh')
这里的< <(command)是进程替换语法,让mapfile直接读取命令的输出结果。
4. 遍历数组并处理每个键值对
遍历数组时,可以用jq直接拆分每个元素的时间戳和值,避免使用eval带来的安全风险:
for item in "${transactions[@]}"; do timestamp=$(echo "$item" | jq -r '.[0]') value=$(echo "$item" | jq -r '.[1]') # 替换为你的实际操作逻辑 echo "处理记录:时间戳=$timestamp,值=$value" done
完整脚本示例
#!/bin/bash # 替换为你的目标URL target_url="https://example.com/api/transactions" # 获取数据并写入数组 mapfile -t transactions < <(curl "$target_url" | jq -r '.data[].data.transaction[] | @sh') # 遍历处理每一条交易数据 for item in "${transactions[@]}"; do timestamp=$(echo "$item" | jq -r '.[0]') value=$(echo "$item" | jq -r '.[1]') # 这里添加你的业务操作,比如写入文件、调用其他脚本等 echo "已处理:时间戳[$timestamp],对应值[$value]" done
内容的提问来源于stack exchange,提问作者Sonali
相关产品推荐
相关产品推荐

