#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
) .