Mam fragment JSON.
Następujące nie działa:
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}
PERSON
echo -n "$VALUE" | python -m json.tool
Wynik to:
Żaden obiekt JSON nie mógł zostać zdekodowany
Robiąc to samo z jq
, tj
echo -n "$VALUE" | jq '.'
Brak wyników.
To samo zachowanie dotyczy:
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Odpowiedź:
Żaden obiekt JSON nie mógł zostać zdekodowany
Ale następujące prace:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
echo $VALUE
bez... | jq
byłoby pouczające.Odpowiedzi:
Brak danych wyjściowych.
Dokument tutaj jest przekierowaniem , nie można przekierować do zmiennej.
Podczas analizowania wiersza poleceń przekierowania są obsługiwane w oddzielnym kroku niż przypisania zmiennych. Twoje polecenie jest zatem równoważne z (zwróć uwagę na spację)
Oznacza to, że przypisuje pusty ciąg do zmiennej, a następnie przekierowuje standardowe wejście z ciągu tutaj do polecenia (ale nie ma polecenia, więc nic się nie dzieje).
Zauważ, że
jest ważne, jak jest
Tyle, że nie ma polecenia, którego standardowy strumień wejściowy można ustawić tak, aby zawierał dane, więc został po prostu utracony.
Działa to jednak:
Tutaj jest polecenie, które odbiera dokument tutaj
cat
i kopiuje go na standardowe wyjście. To jest następnie przypisywane do zmiennej poprzez podstawienie polecenia.W twoim przypadku możesz zamiast tego użyć
bez wykonywania dodatkowego kroku przechowywania danych w zmiennej.
źródło
PERSON="
wstawić znak nowej linii i dane wieloliniowe, a następnie kolejną"
na końcu.PERSON='
. To chyba, że OP chce później interpolować zmienne.Ponieważ zmienna nie jest ustawiana przez heredoc:
Jeśli chcesz użyć heredoc do przypisania wartości do zmiennej, potrzebujesz czegoś takiego:
źródło
<< \PERSON
ochronę przed$
s na wejściu i odwrotnymi ukośnikami na końcach linii.$(cat <<EOF ... EOF)
to dziwna konstrukcja: uruchamianie podpowłoki, a następnie wysyłanie heredoc do kota w celu wysłania go do STDOUT, a następnie przypisanie wyniku tej podpowłoki do zmiennej? Chciałbym, żeby ludzie myśleli o tym, co mówią o swoich procesach myślowych. Przypisanie heredoc do zmiennej poprzezread
, dla porównania, jest rozsądne.$(cat << EOF
… (dane)…EOF
)
jest dziwny. Jest niewygodny i zawiły, ale taki też jestread -d … << EOF
- szczególnieread -d '' << EOF
. Doceniam odpowiedź terdona, ponieważ używa tylko wbudowanych programów, bez programów. Ale, co ważniejsze,$(cat << EOF
… (dane)…EOF
)
zawodzi, jeśli jakaś linia kończy się na\
(odwrotny ukośnik) - patrz komentarze pod odpowiedzią Kusalanandy .Jest tak, ponieważ sposób, w jaki zdefiniowałeś tutaj dokument do użycia z JSON, jest zły. Musisz użyć go jako
i wykonanie
printf "$VALUE"
powinno zrzucić JSON zgodnie z oczekiwaniami.źródło
Heredoki i zmienne nie mieszają się dobrze, a przynajmniej nie w ten sposób. Możesz albo…
Przekaż heredoc jako standardowe wejście aplikacji
lub…
Przechowuj tekst wielowierszowy w zmiennej powłoki
Użyłem pojedynczych cudzysłowów, aby uniknąć konieczności ucieczki od wewnętrznych podwójnych cudzysłowów. Oczywiście możesz także użyć podwójnych cudzysłowów, np. Jeśli potrzebujesz rozszerzyć parametry:
Następnie możesz później użyć wartości zmiennej.
źródło