jq는 일치하는 패턴을 선택하지만 그 앞에 다른 패턴이 있으면 선택하지 않습니다.

jq는 일치하는 패턴을 선택하지만 그 앞에 다른 패턴이 있으면 선택하지 않습니다.

"vagrant packer"라는 응용 프로그램을 실행할 때마다 항상 원격 위치에서 iso 및 체크섬 파일을 다운로드하므로 iso를 로컬 위치로 다운로드하는 스크립트를 만들고 있지만 게시된 날짜가 내 날짜보다 높은 경우에만 가능합니다. 지역적인 것. 그렇다면 iso와 체크섬을 다운로드한 다음 출시 날짜를 로컬 .conf 파일에 저장합니다.

그래서 체크섬의 다운로드 URL을 얻으려고했습니다.프로젝트 github API URL, 하지만 download_url이 먼저 일치하지 않아야 하고 그 다음 패턴이 일치해야 합니다.

"불안정"을 포함하고 ".iso.sha512"로 끝날 필요는 없습니다.

실행 sh

...
    echo downloading checksum..
    checksum_download_url=$(curl -s $github_latest_api_url | jq -r '.assets[].browser_download_url|select(match(".(?!unstable).iso.sha512"))')
...

보시다시피 먼저 올바른 다운로드 URL을 얻은 다음 다음 줄에서 컬 다운로드 명령을 실행하려고 합니다.

나는 이것을 시도했지만 함수와 일치하는 정규식이 무엇인지 알 수 없습니다.
여전히 결과가 나오지 않거나, 구문 오류가 있거나, 불안정한 행이 포함되어 있습니다.

#!/bin/bash

source ./uploads/mai-base.conf

prerelease=$(curl -s $github_latest_api_url | jq -r '.prerelease')

if [ !prerelease ]; then
  
  r_publish_date=$(date -d $(curl -s $github_latest_api_url | jq -r '.published_at') +%s)
  l_publish_date=$(date -d $publish_date +%s)

  if [ $r_publish_date -gt $l_publish_date ]; then
    echo downloading checksum..
    checksum_download_url=$(curl -s $github_latest_api_url | jq -r '.assets[].browser_download_url|select(match(".(?!unstable).iso.sha512"))')
    echo $checksum_download_url
    #curl -L $download_url 
    echo downloading iso..
    # downloading iso code goes here..

    # date saving to mai-base.conf goes here..
  fi
fi

# Start packer application..
# PACKER_LOG=1 packer build -var $ISO_VERSION manjaro-arm-installer.pkr.hcl

답변1

여기서는 단순화를 위해 올바른 부정/긍정 뒤로/앞으로 보기를 얻는 대신 두 가지 개별 테스트를 수행할 것입니다. 또한 정규식이 일치하는지 여부만 알고 싶다면 다음을 test()대신 사용하세요.match()

jq '.assets[].browser_download_url|select( (test("unstable")|not) and test("iso.sha512$"))' 

스크립트의 경우 변수를 [ !prerelease ]사용하지 않는 스크립트를 사용하고 있습니다 prerelease. 당신이 말하고 싶은 것은

if [ "$prerelease" != false ]; then

하지만 이는 추가 변수 없이 수행할 수 있습니다.

if ! curl -s "$github_latest_api_url" | jq -e .prerelease >/dev/null
then
    ...
fi

-e옵션을 사용 jq하면 유틸리티가 마지막 평가에 따라 종료 상태로 종료됩니다.

JSON 문서를 3번 가져오지 않으려면 가져온 JSON 문서를 임시 파일에 저장하세요. 세 번 구문 분석하는 것을 방지하려면 모든 데이터를 한 번에 꺼내십시오.

curl -s ... |
jq -r '[.prerelease, .published_at, (.assets[].browser_download_url|select( (test("unstable")|not) and test("iso.sha512$"))) ] | @tsv' |
{
    IFS=$'\t' read -r prerelease r_publish_date checksum_download_url
    if [ "$prerelease" != false ]; then
        # use "$r_publish_date" and "$checksum_download_url"
    fi
}

관련 정보