从curl GET响应读取json值



如何从json响应中获得特定字段?

#!/bin/bash -
status=`curl -sk -H "api-token: $TOKEN" -H "Content-Type: application/json" https://path_to/values` 

响应是

{
"cancelled": false,
"percentage": 0.5,
"state": "running"
}

我想轮询'状态',响应百分比为100,取消字段始终为真。如果没有jq这样的工具,是否可以做到这一点?

编辑我想知道我是否可以在系统上安装jq。我使用jq的方法正确吗?

while
update_status=`curl -sk -H "api-token: $TOKEN" -H "Content-Type: application/json" https://path_to/values`
cancelled=$(jq -r '.cancelled' <<< "$update_status")
percentage_complete=$(jq -r '.percentage_complete' <<< "$update_status")
state=$(jq -r '.state' <<< "$update_status")
[[ $cancelled -eq 1 || $state == 'running' ]]
do true; done

"cancelled"是一个布尔和"状态";是一个字符串,值为"running"或";not_running"。如何添加显示更新是否失败的日志消息?我不太确定do while循环…

echo "[INFO] Update done" ## depending on the failed var?

使用jq并将结果读入数组:

readarray -t dat <<< "$(curl -sk -H "api-token: $TOKEN" -H "Content-Type: application/json" https://path_to/values | jq -r '.cancelled,.percentage,.state')"

该数组可以在if语句中使用:

if [[ "${dat[0]" == "true" && "${dat[1]" == "100" ]]
then
echo "There are no issues"
else
echo "There are issues"
fi

如果jq真的不是一个选项,如果返回的json和发布的一样,你可以使用awk并返回一个错误代码:

if (curl -sk -H "api-token: $TOKEN" -H "Content-Type: application/json" https://path_to/values | awk '/(cancelled)|(percentage)|(state)/ { gsub("[",:]","",$0);gsub(" ","",$1);map[$1]=$2 } END { if ( map["cancelled"]=="false" && map["percentage"] == 100 ) { exit 0 } else { exit 1 } }');
then
echo "There are no issues"
else
echo "There are issues"
fi

将curl命令的输出管道到awk中,其中有"cancelled", "percentage"或";state"在行,过程。删除任何","或者双引号或者"; "然后用gsub从第一个以空格分隔的字段中删除任何空格,然后添加到一个名为map的数组中,并使用第一个字段作为索引,第二个字段作为值。最后,检查map数组的索引,如果所有索引都符合预期,则以0退出,否则以0退出。

最新更新