#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