проанализировать одно поле из массива JSON в массив bash

У меня есть вывод JSON, содержащий список объектов, хранящихся в переменной. (Я не могу правильно формулировать это)

[ { "item1": "value1", "item2": "value2", "sub items": [ { "subitem": "subvalue" } ] }, { "item1": "value1_2", "item2": "value2_2", "sub items_2": [ { "subitem_2": "subvalue_2" } ] } ] 

Мне нужны все значения для item2 в массиве для сценария bash, который будет запущен на ubuntu 14.04.1.

Я нашел множество способов получить весь результат в массив, но не только те элементы, которые мне нужны

Используя jq :

 $ cat json [ { "item1": "value1", "item2": "value2", "sub items": [ { "subitem": "subvalue" } ] }, { "item1": "value1_2", "item2": "value2_2", "sub items_2": [ { "subitem_2": "subvalue_2" } ] } ] 

КОД:

 arr=( $(jq -r '.[].item2' json) ) printf '%s\n' "${arr[@]}" 

ВЫВОД:

 value2 value2_2 

Благодаря sputnick я добрался до этого:

 arr=( $(curl -k https://localhost/api | jq -r '.[].item2') ) 

JSON у меня есть выход из API. Все, что мне нужно было сделать wans, удалить аргумент файла и pipe | выход curl в jq. Отлично работает и сохранил некоторые шаги.

На самом деле багги:

 # BAD: Output line of * is replaced with list of local files; can't deal with whitespace arr=$( curl -k "$url" | jq -r '.[].item2' ) 

Вместо этого используйте:

 # GOOD (with bash 4.x+), but can't detect failure readarray -t arr < <(curl -k "$url" | jq -r '.[].item2' ) 

… или, еще лучше …

 # GOOD (with bash 3.x+), *and* has nonzero status if curl or jq fails IFS=$'\n' read -r -d '' -a arr \ < <(set -o pipefail; curl --fail -k "$url" | jq -r '.[].item2' && printf '\0')