Mam tablicę JSON taką:
{
"SITE_DATA": {
"URL": "example.com",
"AUTHOR": "John Doe",
"CREATED": "10/22/2017"
}
}
Szukam iteracji po tej tablicy za pomocą jq, dzięki czemu mogę ustawić klucz każdego elementu jako nazwę zmiennej i wartość jako wartość.
Przykład:
- URL = „example.com”
- AUTOR = „John Doe”
- UTWORZONY = „10/22/2017”
To, co mam do tej pory, iteruje tablicę, ale tworzy ciąg:
constants=$(cat ${1} | jq '.SITE_DATA' | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]")
Które wyjścia:
URL=example.com
AUTHOR=John Doe
CREATED=10/22/2017
Chcę użyć tych zmiennych w dalszej części skryptu:
echo ${URL}
Ale w tej chwili przypomina to pusty wynik. Zgaduję, że potrzebuję eval
czegoś w tym stylu, ale nie mogę położyć na tym palca.
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.declare --
bezpieczeństwo swojej wersji, porównując klucz $ z listą dozwolonych nazw zmiennych.Właśnie zdałem sobie sprawę, że mogę przeglądać wyniki i sprawdzać każdą iterację:
Pozwala mi na:
źródło
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
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
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:
Jeśli dane nie pochodzą z tablicy, tj. jest przedmiotem takim jak:
wystarczy usunąć początkowy indeks:
To stare pytanie, ale czułem dzielenie się, ponieważ trudno było je znaleźć
źródło