Мені дуже подобається пропозиція @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 )"
Це давнє питання, але я відчув спільне використання, оскільки його важко було знайти
declare -- “$key=$value”
і мати$AUTHOR
роботу тощо, як в оригіналі, без масиву. Це все-таки безпечніше, ніж eval, хоча змінитиPATH
або все-таки все-таки можливо так менше, ніж ця версія.