Bardzo podoba mi się sugestia @Michel. Czasami naprawdę możesz po prostu wyodrębnić niektóre wartości zmiennych, aby wykonać zadanie na tym konkretnym serwerze za pomocą BASH. Zatem pożądane zmienne są znane. Takie zastosowanie jest sposobem uniknięcia lub wielokrotnych wywołań jq w celu ustawienia wartości dla zmiennej, a nawet użycia instrukcji read z wieloma zmiennymi, w których niektóre mogą być poprawne i puste, co prowadzi do zmiany wartości (to był mój problem)
moje poprzednie podejście prowadzi do błędu przesunięcia wartości, jeśli .svID [] .ID = "" ( sv otrzyma wartość slotID
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
Jeśli pobrałeś obiekt za pomocą curl, oto moje podejście do zmiany nazwy niektórych zmiennych na przyjazną nazwę, aby wyodrębnić dane z tablic danych
użycie eval i filtrów rozwiąże problem z jedną linią i wytworzy zmienne o pożądanej nazwie
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 )"
Zaletą w tym przypadku jest fakt, że w pierwszym kroku będzie filtrować, zmieniać nazwę, formatować wszystkie pożądane zmienne. Zauważ, że tam jest. [0] | jest to bardzo powszechne, jeśli źródło pochodzi z serwera API RESTFULL używającego GET, dane odpowiedzi jako:
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
Jeśli dane nie pochodzą z tablicy, tj. jest przedmiotem takim jak:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
wystarczy usunąć początkowy indeks:
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 )"
To stare pytanie, ale czułem dzielenie się, ponieważ trudno było je znaleźć
declare -- “$key=$value”
i mieć$AUTHOR
etc działające jak w oryginale, bez tablicy. Jest to nadal bezpieczniejsze niż ewaluacja, choć zmianaPATH
lub coś jest nadal możliwe, więc mniej niż ta wersja.