将对象与JSON Shell命令分开

时间:2018-10-23 18:30:07

标签: json shell

我有一个如下的JSON数组。

[ { "release": "2008.1006", "kernel": "2.6.32-754.3.5", "os": "6.10", "current": true }, { "release": "2008.1006", "kernel": "3.10.0-862.14.4", "os": "7.5", "current": true } ]

当我使用${#array[@]}打印数组长度时,它给我1。我想要一个包含使用Shell脚本在此数组中存在的对象的数组。

我想要大括号下的对象数组。尝试了很多hack,但是我没有得到想要的结果。

1 个答案:

答案 0 :(得分:0)

s='[ { "release": "2008.1006", "kernel": "2.6.32-754.3.5", "os": "6.10", "current": true }, { "release": "2008.1006", "kernel": "3.10.0-862.14.4", "os": "7.5", "current": true } ]'
IFS=$'\n' read -r -d '' -a items < <(jq -c '.[]' <<<"$s" && printf '\0')

echo "Number of items: ${#items[@]}"
(( ${#items[@]} )) && printf ' - %s\n' "${items[@]}"

...正确发射:

Number of items: 2
 - {"release":"2008.1006","kernel":"2.6.32-754.3.5","os":"6.10","current":true}
 - {"release":"2008.1006","kernel":"3.10.0-862.14.4","os":"7.5","current":true}

如果仅支持bash 4.0或更高版本,则可以将read -a换成readarray -t(尽管在jq调用失败的情况下,不再通过不成功的退出状态):

readarray -t items <<<"$(jq -c '.[]' <<<"$s")"