파이프를 사용하지 않고 변수에서 jq를 읽는 가장 짧은 방법은 무엇입니까?

파이프를 사용하지 않고 변수에서 jq를 읽는 가장 짧은 방법은 무엇입니까?

다음 bash 스크립트가 있다고 가정해 보겠습니다.

json="$(curl -s "https://nominatim.openstreetmap.org/reverse.php?lat=-23.513442&lon=-46.384794&zoom=18&format=jsonv2")"
jq '.address.road' <(echo "$json")

기본적으로 Nominatim API를 사용하여 특정 위치의 도로 이름을 가져오고 있습니다. 결과는 다음과 같습니다.

"Rua Linaria"

변수의 값을 사용하기 위해 프로세스 대체를 사용하고 있습니다 <(echo "$json"). 하지만 이것이 가장 간단한 접근 방식은 아닌 것 같습니다. 매개변수 검색을 시도했지만 나에게 맞는 매개변수를 찾을 수 없었습니다. 의사코드에서는 다음과 같은 것을 원합니다:$jsonjqman jq

jq --getvar "$json" '.address.road'

jq이 작업을 수행할 수 있는 매개변수 가 있나요 ? 아니면 파일이나 파이프에서만 작동하며 이 경우 프로세스 대체를 사용하는 것이 해결책입니까?

답변1

아니면 파일이나 파이프에서만 작동하며 이 경우 프로세스 대체를 사용하는 것이 해결책입니까?

글쎄요, 파일이나 표준 입력에서 작동합니다. 파이핑은 표준 입력을 사용하는 방법이고 프로세스 대체는 파일을 사용하는 방법입니다. heredocs 또는 herestrings를 표준 입력으로 사용할 수도 있습니다.

즉, 다음을 사용할 수 있습니다.--argjson:

% foo='{"a": "b"}'
% jq --argjson foo "$foo" -n '$foo.a'
b

따라서 귀하의 경우에는 다음과 같이 할 수 있습니다.

json="$(curl -s "https://nominatim.openstreetmap.org/reverse.php?lat=-23.513442&lon=-46.384794&zoom=18&format=jsonv2")"
jq --argjson j "$json" -n '$j.address.road'

하지만 개인적으로 가장똑바로이를 수행하는 방법은 다음으로 파이프하는 것 curl입니다 jq.

curl -s "https://nominatim.openstreetmap.org/reverse.php?lat=-23.513442&lon=-46.384794&zoom=18&format=jsonv2" |
  jq '.address.road'

관련 정보