Napisałem skrypt do pobierania określonej wartości file.json
. Działa, jeśli podam wartość do jq select
, ale zmienna wydaje się nie działać (lub nie wiem, jak jej użyć).
#!/bin/sh
#this works ***
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="[email protected]") | .id')
echo "$projectID"
EMAILID=myemail@hotmail.com
#this does not work *** no value is printed
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="$EMAILID") | .id')
echo "$projectID"
json
bash
environment-variables
jq
asidd
źródło
źródło
jq -r --arg var "$var" '.[$var]'
stackoverflow.com/questions/34745451/ ...Odpowiedzi:
Rozważ również przekazanie zmiennej powłoki (EMAILID) jako zmiennej jq (tutaj również EMAILID, dla ilustracji):
Postscriptum
Dla przypomnienia, inną możliwością byłoby użycie
env
funkcji jq do uzyskiwania dostępu do zmiennych środowiskowych. Weźmy na przykład pod uwagę następującą sekwencję poleceń bash:Dane wyjściowe to ciąg JSON:
źródło
jq
poprawnie utworzyć filtr przy użyciu wartości, zamiast używać gobash
do tworzenia łańcucha, który jestjq
interpretowany jako filtr. (Zastanów się, co się stanie, jeśli wartośćEMAILID
zawiera a)
.)function n2 { termux-contact-list |jq -r --arg v1 "$1" '.[] | select(.name==$v1)|.number' }
Dzwonię:n2 Name1
env
funkcja jq jest zmieniana między jq 1.4 a 1.5+, więc odniesienia doenv.EMAILID
(w przykładzie tej odpowiedzi) nie działają w jq 1.4, dlatego zaleca się użycie--arg EMAILID "$EMAILID"
konstrukcji, jeśli musisz użyć jq 1.4. Mam nadzieję że to pomoże; zajęło mi tylko dzień +, żeby samemu to--arg
zostaną przekazane jako ciągi. Jeśli chcesz przekazać dane innego typu JSON, użyj--argjson
, który przeanalizuje ciąg jako JSON, np.--argjson myObj '{"a": [1, 2]}'
Rozwiązałem ten problem, unikając wewnętrznych podwójnych cudzysłowów
źródło
-c
To kwestia wyceny, potrzebujesz:
Jeśli użyjesz pojedynczych cudzysłowów, aby oddzielić główny ciąg, powłoka przyjmuje
$EMAILID
dosłownie.„Double cytat” każdy dosłowne, że zawiera spacje / metaznaki i każdy rozbudowa:
"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
. Użyj'single quotes'
kodu lub dosłowny$'s: 'Costs $5 US'
,ssh host 'echo "$HOSTNAME"'
. Zobaczhttp://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
źródło
termux-contact-list |jq -r '.[] | select(.name=='$1')|.number'
. Wynik:jq Compile error
jq
nie lubią pojedynczych cudzysłowów:jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?)
Publikując go tutaj, ponieważ może to pomóc innym. W łańcuchu może być konieczne przekazanie cudzysłowów do jq. Aby wykonać następujące czynności z jq:
w bash możesz zrobić
zasadniczo unikając cudzysłowów i przekazując je do jq
źródło
Innym sposobem osiągnięcia tego jest użycie flagi jq "--arg". Korzystając z oryginalnego przykładu:
Zobacz tutaj, gdzie znalazłem to rozwiązanie: https://github.com/stedolan/jq/issues/626
źródło
Wiem, że odpowie trochę później, przepraszam. Ale to działa dla mnie.
Teraz jestem w stanie pobrać i przekazać zawartość zmiennej do jq
W moim przypadku potrzebowałem użyć podwójnego cudzysłowu i cudzysłowu, aby uzyskać dostęp do wartości zmiennej.
Twoje zdrowie.
źródło
Jq ma teraz lepszy sposób na dostęp do zmiennych środowiskowych, możesz użyć env.EMAILI:
źródło
Trochę niezwiązane, ale nadal będę to umieszczać tutaj, Do innych praktycznych celów zmienne powłoki mogą być używane jako -
źródło