#json #shell #jq
#json #оболочка #jq
Вопрос:
Я пытаюсь написать функцию bash, которая будет анализировать ответ json и утверждать, удовлетворяет ли массив объектов некоторому условию, но я ничего не добился с тестированием этого состояния.
Примерный JSON после начальных преобразований:
[
{
"key": "Org1",
"value": true
},
{
"key": "Org2",
"value": false
}
]
Условие состоит в том, чтобы все элементы (независимо от длины массива) имели значение == true .
Я выполняю преобразования JSON с использованием jq, но я понятия не имею, как сохранить результат в переменной bash, чтобы я мог перебрасывать элементы или уменьшать массив до одного значения, которое я мог бы анализировать непосредственно в операторе if.
Кто-нибудь может помочь?
Комментарии:
1.
echo "$json" | jq 'all(.value)'
тесты свойства value каждого объекта в массиве являются истинными.
Ответ №1:
Вы можете использовать all
функцию для уменьшения массива логических значений * до true
значения, если все логические значения имеют значение true. jq
выведет это значение, которое вы можете получить с помощью подстановки команд.
result=$(jq 'map(.value) | all' tmp.json)
Тем не менее, вам может не понадобиться фактический вывод. Может быть достаточно использовать --exit-status
опцию (короткую форму -e
), чтобы проверить, вернется ли jq
возврат true
или нет.
if jq -e 'map(.value) | all' tmp.json > /dev/null; then
echo "All were true"
else
echo "At least one was false"
fi
* Среди прочего; см. Комментарий @peak ниже
Комментарии:
1. Технически, несмотря на документацию,
all
семейство фильтров использует достоверность, а неtrue
критерий. Рассмотрим, напримерall(1;.)
, #=> true;all(nan;.)
#=> true;all(empty;.)
#=> true;all(null;.)
#=> false ;2. Святая корова, я не видел этой
all
функции. Большое вам спасибо за это!