Массив JSON для переменных bash с использованием jq

Проверьте RapidCache!

Это часть RapidDisk. Он делает IO кэширование блоков против файлов (как и кэш linux), что делает его идеальным для ВМ!

http://rapiddisk.org/index.php

14
31.12.2017, 00:50
1 ответ

Мне очень нравится предложение @Michel. Иногда вы действительно можете просто извлечь значение некоторых переменных для выполнения задачи на этом конкретном сервере с помощью BASH. Так,желаемые переменные известны. Использование этого подхода позволяет избежать множественных вызовов jq для установки значения для каждой переменной или даже использовать оператор чтения с несколькими переменными, в которых некоторые из них могут быть действительными и пустыми, что приводит к сдвигу значения (, который был моим проблема)

мой предыдущий подход, который привел к ошибке смещения значения, если.svID[ ].ID=""(sv получит значение slotID

-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)

Если вы загрузили объект с помощью curl, вот мой подход к переименованию некоторых переменных в понятное имя для извлечения данных из массивов данных

использование eval и фильтров решит проблему одной строкой и создаст переменные с нужным именем

eval "$(jq -r '.[0] | {varNameExactasJson, renamedVar1:.var1toBeRenamed, varfromArray:.array[0].var, varValueFilter: (.array[0].textVar|ascii_downcase)} | to_entries |.[] |.key + "=\"" + (.value | tostring) + "\""' <<< /path/to/file/with/object )"  

Преимуществом в этом случае является тот факт, что он будет фильтровать, переименовывать, форматировать все нужные переменные на первом этапе. Обратите внимание, что там есть.[0] | это очень распространено, если источник с сервера RESTFULL API с использованием GET, данные ответа как:

[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500,....}]

Если ваши данные не из массива, т.е. объект типа:

{"varNameExactasJson":"this value", "var1toBeRenamed: 1500,....}

просто удалите начальный индекс:

eval "$(jq -r '{varNameExactasJson, renamedVar1:.var1toBeRenamed, varfromArray:.array[0].var, varValueFilter: (.array[0].textVar|ascii_downcase)} | to_entries |.[] |.key + "=\"" + (.value | tostring) + "\""' <<< /path/to/file/with/object )"  

Это старый вопрос, но я решил поделиться, так как его было трудно найти

0
27.01.2020, 19:50

Теги

Похожие вопросы