У меня есть массив JSON, например, так:
{
"SITE_DATA": {
"URL": "example.com",
"AUTHOR": "John Doe",
"CREATED": "10/22/2017"
}
}
Я пытаюсь перебрать этот массив с помощью jq, чтобы я мог установить ключ каждого элемента в качестве имени переменной и значение в качестве ее значения.
Пример:
- URL = "example.com"
- AUTHOR = "Джон Доу"
- СОЗДАНО = "10/22/2017"
То, что у меня есть, перебирает массив, но создает строку:
constants=$(cat ${1} | jq '.SITE_DATA' | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]")
Какие выводы:
URL=example.com
AUTHOR=John Doe
CREATED=10/22/2017
Я хочу использовать эти переменные ниже в сценарии:
echo ${URL}
Но это отголосок пустой информации на данный момент. Я предполагаю, что мне нужно eval
или что-то там, но, кажется, не могу указать на это.
declare -- “$key=$value”
и$AUTHOR
работать так же, как в оригинале, без массива. Это все еще безопаснее, чем Eval, хотя изменениеPATH
или что-то еще возможно, так что меньше, чем в этой версии.declare --
версию безопасной, сравнив $ key со списком разрешенных имен переменных.Просто понял, что я могу перебрать результаты и оценить каждую итерацию:
Позволяет мне сделать:
источник
Мне очень нравится предложение @Michel. Иногда вы можете просто извлечь значение некоторых переменных, чтобы выполнить задачу на этом конкретном сервере, используя BASH. Итак, желаемые переменные известны. Использование этого подхода - это способ избежать или многократных обращений к jq для установки значения для переменной или даже к использованию оператора read с несколькими переменными, в которых некоторые могут быть допустимыми и пустыми, что приводит к сдвигу значения (это была моя проблема)
Мой предыдущий подход привел к ошибке сдвига значения, если .svID [] .ID = "" ( sv получит значение slotID
Если вы загрузили объект с помощью curl, вот мой подход переименовать некоторые переменные в понятное имя для извлечения данных из массивов данных
использование eval и фильтров решит проблему с одной строкой и создаст переменные с нужным именем
Преимущество в этом случае заключается в том, что он будет фильтровать, переименовывать, форматировать все нужные переменные на первом этапе. Заметьте, что там есть. [0] | это очень часто бывает, если источник if с сервера API RESTFULL, использующего GET, ответит как:
Если ваши данные не из массива, т.е. это объект как:
просто удалите начальный индекс:
Это старый вопрос, но я чувствовал, что делюсь, так как было трудно найти
источник