Вам просто нужно использовать атрибут has
, который возвращает логическое значение в зависимости от наличия упомянутого ключа
jq 'has("sys/")'
Обратите внимание, что вы можете настроить jq
для возврата строки bool или даже null
, но ни один из них не может быть напрямую использован в условной оболочке, которая использует только коды выхода 0
или 1
.
Если вы хотите, чтобы результат jq
использовался в условном выражении оболочки вы можете вернуть код завершения. Есть опция, которая поддерживает это. Из документации
-e / --exit-status:
Устанавливает состояние выхода jq
в 0
, если последние выходные значения не были ни false
, ни null
, 1
если последнее выходное значение было либо false
, либо null
, либо 4
, если действительный результат не был получен.
Так что используйте это для ваших данных JSON
jq -e 'has("sys/")' json > /dev/null
echo $?
0
, но для несуществующего ключа sys1
он выдает
jq -e 'has("sys1/")' json > /dev/null
echo $?
1
. Обратите внимание, что > /dev/null
подавляет stdout, выбрасываемый при применении фильтра, который является логическим значением строки. Если ваша версия jq
не поддерживает эту опцию или вы ищете альтернативный способ сделать это, вы можете напрямую сопоставить строку, возвращаемую из фильтра has()
, вместо оценки кода выхода, т.е.
if [ $(jq 'has("sys/")' json) = "true" ]; then
printf '%s\n' 'key present'
fi