설치를 시도하기 전에 프로젝트의 애플리케이션 이름을 가져오는 것을 목표로 쉘 스크립트에서 홈브류 API를 호출하고 있습니다. 다행히 API는 이를 이라는 요소에서 제공합니다 artifacts
. 안타깝게도 artifacts
하나의 요소만 선택할 수 있는 키가 더 이상 없습니다. 순서에 관계없이 객체와 배열을 혼합할 수 있습니다.
Google Chrome의 샘플 데이터 스니펫:
{
"name":[
"Google Chrome"
],
"artifacts":[
[
"Google Chrome.app"
]
]
}
그러나 도커는 또 다른 이야기입니다.
{
"name":[
"Docker"
],
"artifacts":[
{
"trash":[
"$(brew --prefix)/bin/docker-compose.backup",
"$(brew --prefix)/bin/docker.backup"
]
},
[
"docker.app"
]
]
}
artifacts
따라서 이와 같은 쉘 스크립트에서 요소 0을 가져올 수 없습니다 .
artifacts=$(curl -s "https://formulae.brew.sh/api/cask/google-chrome.json" | jq -r '.artifacts[0][0]')
artifacts
jq를 사용하여 *.app으로 끝나는 패턴 값에 대한 요소를 검색하는 방법이 있나요 ? 내가 생각해 낼 수 있는 가장 좋은 의사 코드는 이것이지만 $element를 참조하려고 할 때 약간의 혼란을 겪습니다.
# $cask is determined by a list the script loops through ('google-chrome' is one example)
for element in $(curl -s "https://formulae.brew.sh/api/cask/$cask.json" | jq -r '.artifacts'); do
# if $element is an array and it's value ends with "*.app"
# assign to a variable for later use
done
여기 하나 있어요jqplay 조각반환된 더 복잡한 JSON 중 하나입니다. 고유 값 "docker.app"을 포함하는 배열의 일부가 표시됩니다. 이것이 내가 달성하고 싶은 것입니다.
답변1
이 jq
쿼리는 Docker의 JSON에서 작동합니다.
.artifacts[] | arrays[0] | select(endswith(".app"))
필터는 arrays
요소에서 배열을 선택한 artifacts
다음 이 배열의 첫 번째 요소를 조회하여 로 끝나는 요소를 찾을 수 있습니다 .app
.
답변2
유사한 검색어무루가 그랬듯이artifacts
하지만 배열의 항목이 문자열로 끝나면 배열의 모든 아티팩트를 반환합니다 .app
.
.artifacts[] | select(type == "array" and any(endswith(".app")))[]
또는,
.artifacts[] | arrays | select(any(endswith(".app")))[]
따라서 애플리케이션에 일부 아티팩트가 있는 경우thething.app
그리고 someotherthing.quux
동일한 배열에 넣은 다음 둘 다 반환합니다.