JQ возвращает ноль в виде строки, если JSON пуст - PullRequest
0 голосов
/ 03 ноября 2018

Я запускаю эту команду, получаю значение из json;

addr=$(./xuez-cli getnetworkinfo | jq -r '.localaddresses[0].address')

и все работает отлично.

НО, если эта .localaddresses[0].address часть пуста или даже не существует, jq устанавливает переменную addr как null следующим образом; addr=null

и я хочу проверить, является ли json пустым / пустым, и выполнить какую-то другую команду вместо того, чтобы анализировать ее как null строку.

Я не мог найти способ обойти это. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Что-то полезное, что я нашел для сценариев оболочки, было:

jq '.foo // empty'

Возвращает совпадение в случае успеха и пустую строку в случае неудачи. Так что в Bash я использую:

addr=$(./xuez-cli getnetworkinfo | jq -r '.localaddresses[0].address // empty')

if [[ ! -z "$addr" ]]; then
    # do something
fi

Ссылка: https://github.com/stedolan/jq/issues/354#issuecomment-43147898 https://unix.stackexchange.com/questions/451479/jq-print-for-null-values

0 голосов
/ 03 ноября 2018

Во-первых, примечание: в addr=null нет ничего плохого по своей сути; Вы можете просто проверить это:

if [[ $addr = null ]]; then ...code here...; fi

Остальная часть этого ответа делает вид, что вышеизложенное не соответствует действительности. :)


Существуют две практики, которые отличаются простотой обработки ошибок в этом случае:

  • Использование set -o pipefail позволит определить, не произошла ли какая-либо часть - не только последний компонент - конвейера оболочки.
  • Использование jq -e приведет к тому, что состояние выхода jq будет отражать, было ли возвращено содержимое, которое было либо ложным, либо нулевым.

Таким образом:

set -o pipefail
if addr=$(./xuez-cli getnetworkinfo | jq -er '.localaddresses[0].address'); then
  : "address retrieved successfully; this message is not logged unless set -x is active"
else
  echo "Running other logic here"
fi

... переходит к Running other logic here, если либо jq не удается (а -e указывает, что false и null должны рассматриваться как отказы), или если xuez-cli сообщает о неудачном статусе выхода.

...