Использование jq для чтения в формате json в виде массива

#bash #zsh #jq

#bash #zsh #jq

Вопрос:

У меня есть этот пример test.json файла:

 {
    "folder": {
    "name": "Desktop",
    "path": "Users/user/Desktop",
    "executable": false
    }
}
  

Я пытаюсь преобразовать объект, содержащийся в ‘folder’, в переменную $var в виде массива. Желаемый результат — $var содержит следующее:

 [
  {
    "name": "Desktop",
    "path": "Users/user/Desktop",
    "executable": false
  }
]
  

Это казалось относительно простым. jq '.folder' test.json для чтения в значении папки, а затем для передачи выходных данных с использованием -s флага, чтобы заключить их в массив. Эта команда выполняется просто отлично:

 jq '.folder' test.json | jq -s
  

Однако, когда я пытаюсь сохранить результат в переменную, она выдает ошибку, отображающую jq инструкцию по использованию. Чего мне не хватает? Есть ли другой способ добиться этого?

 var=$(jq '.folder' test.json | jq -s)
echo $var
  

Я также обнаружил, что это отлично работает в zsh , но выдает ошибку в bash . Не уверен, уместно ли это и связано ли это с разными версиями jq

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

1. Пожалуйста, добавьте желаемый результат (без описания) для этого примера входных данных к вашему вопросу (без комментариев).

2. Я сделал — это второй блок кода

3. Проблема, с которой вы столкнулись при передаче по конвейеру, jq -s решена, но если вы сомневаетесь, просто укажите явный аргумент, например jq -s . . Однако в данном случае лучшим решением является вызов jq только один раз. Пожалуйста, обратите внимание, что в jq 1.5 и выше опции -s часто лучше избегать по соображениям эффективности.

Ответ №1:

Это то, чего вы ожидали?

 $ var="$(jq "[.folder]" test.json)"
$ echo "$var"
[
  {
    "name": "Desktop",
    "path": "Users/user/Desktop",
    "executable": false
  }
]
  

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

1. Идеально! Большое вам спасибо! У вас есть объяснение (или ссылка на него), зачем нужны квадратные скобки? И есть ли у вас какие-либо идеи, почему другой вариант может работать в одном экземпляре, а не в другом?

2. квадратные скобки строго необязательны. С вашим скриптом я получаю тот же результат на своей машине. Я использую $ echo $BASH_VERSION 4.4.12(1)-release