Мне очень нравится предложение @Michel. Иногда вы можете просто извлечь значение некоторых переменных, чтобы выполнить задачу на этом конкретном сервере, используя BASH. Итак, желаемые переменные известны. Использование этого подхода - это способ избежать или многократных обращений к jq для установки значения для переменной или даже к использованию оператора read с несколькими переменными, в которых некоторые могут быть допустимыми и пустыми, что приводит к сдвигу значения (это была моя проблема)
Мой предыдущий подход привел к ошибке сдвига значения, если .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] | это очень часто бывает, если источник if с сервера API RESTFULL, использующего 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 )"
Это старый вопрос, но я чувствовал, что делюсь, так как было трудно найти
declare -- “$key=$value”
и$AUTHOR
работать так же, как в оригинале, без массива. Это все еще безопаснее, чем Eval, хотя изменениеPATH
или что-то еще возможно, так что меньше, чем в этой версии.