Проверьте, является ли результат пустой строкой

#json #bash

#json #bash

Вопрос:

У меня есть файл JSON, который я создал с помощью jq команды. Файл выглядит следующим образом:

 [
  {
    "description": "",
    "app": "hello-test-app"
  },
  {
    "description": "",
    "app": "hello-world-app"
  }
]
  

Я хотел бы иметь простое условие if / else, чтобы проверить, является ли описание пустым.
Я пробовал разные подходы, но ни один из них не работает!!
Я пытался:

 jq -c '.[]' input.json | while read i; do
description=$(echo $i | jq '.description')
if [[ "$description" == "" ]];
then
  echo "$description is empty"
fi
done
  

и с тем же кодом, но это if / else;

 if [[ -z "$description" ]];
then
  echo "$description is empty"
fi
  

Кто-нибудь может мне помочь?

Комментарии:

1. Где вы присваиваете значение переменной $description?

2. Вы когда-нибудь устанавливали переменную $description или предполагаете, что bash будет искать в файлах json соответствующее поле?

3. @Cyrus У меня есть цикл над файлом, подобный этому jq -c '.[]' input.json | while read i; do description=$(echo $i | jq '.description') # here the if... done

4. Кстати.: Ваш JSON недействителен.

5. Была недопустимая конечная запятая. Я удалил его в своем редактировании. Это действительно сейчас, и я не думал, что это влияет на суть вопроса.

Ответ №1:

jq поддерживает условные выражения. Нет необходимости возвращать это в bash (пока):

 < foo jq -r '.[] | if .description == ""
                   then "description is empty"
                   else .description end'
description is empty
description is empty
  

Если вы настаиваете на возврате к bash, вот что происходит:

 jq -c '.[]' foo | while read i; do description=$(echo $i | jq '.description')
printf '%sn' "$description"
done
""
""
  

Здесь вы можете видеть, что расширение $description не является пустым. Это буквально пара кавычек каждый раз.

Здесь есть несколько проблем с конвейером для bash — расширение без кавычек $i , повторная передача jq и перевод пары кавычек в пустую строку между двумя разными языками программирования. Но я думаю, что простой ответ: «просто проверьте, если "$description" расширяется до пары кавычек».

Тестирование кавычек в bash означает цитирование ваших кавычек:

 if [[ $description = '""' ]]; then
    echo '$description expands to a pair of quotes'
fi
  

На мой взгляд, лучшим ответом является сохранение работы в jq.

Комментарии:

1. Спасибо. Однако это сложнее. Внутри if мне нужно написать больше кода. Кроме того, я все еще не понимаю, почему простой bash if / else не работает.

2. @dventi3 если вы хотите спросить о bash, сформулируйте вопрос о bash как можно проще, устранив ненужную jq часть. Однако по опыту я знаю, что вы можете делать мощные вещи только с помощью jq…

3. @dventi3 это сработало для меня — вы, вероятно, забыли указать свои кавычки в тесте. Смотрите мое редактирование.

4. @dventi3 всегда пожалуйста. Пожалуйста, передумайте делать это в bash. Это будет значительно более подвержено ошибкам и его будет сложно поддерживать таким образом.

5. @dventi3 Если вам нужна необработанная строка без кавычек из jq, используйте jq -r ( --raw-output ) .