Нулевой тест в bash - PullRequest
       0

Нулевой тест в bash

0 голосов
/ 16 марта 2020

Возвращает null:

jq --arg light "$i" '.lightstates[$light].on' "$tmp_dir/evening_brightness.json"

Однако, когда я проверяю на ноль, я получаю неожиданный результат:

[[ -z $(jq --arg light "$i" '.lightstates[$light].on' "$tmp_dir/evening_brightness.json") ]] && echo "null" || echo "not null"
not null

Я пытался варианты - использование -n и проверка на пустую строку - но ни один из них не дает желаемого результата в диапазоне значений (где я не хочу ничего выводить, если в переменной нет полезного значения).

(Возможные значения: true, false, string, null.)

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

bash не знает значение null. В этом случае вам нужно сравнить строки:

[ "$(jq -c '.abc' <<< "{}")" == "null" ] && echo "is null"

или вы можете использовать опцию --exit-status из jq:

-e / --exit-status:

Устанавливает состояние выхода jq равным 0, если последние выходные значения не были ни ложными, ни нулевыми, 1, если последнее выходное значение было> ложным или нулевым, или 4, если действительный результат не был получен. Обычно jq завершает работу с 2, если возникла какая-либо проблема использования или системная ошибка, с 3, если произошла ошибка компиляции программы jq, или с 0, если программа jq работала.

1 голос
/ 16 марта 2020

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

if jq <b>-e</b> --arg light "$i" '.lightstates[$light].on' "$tmp_dir/evening_brightness.json" > /dev/null; then
  echo "not null"
else
  echo "null"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...