jq 选择匹配模式,但如果前面有其他模式则不选择

jq 选择匹配模式,但如果前面有其他模式则不选择

每次运行一个名为“vagrant packer”的应用程序时,它总是从远程位置下载 iso 和校验和文件,因此我正在创建一个脚本,将 iso 下载到本地位置,但前提是published_at 日期高于我的日期本地的一个。如果是,我会下载 iso 和校验和,然后将发布日期存储在本地 .conf 文件中。

所以我尝试从以下位置获取校验和的下载网址项目的 github api url,但是 download_url 需要首先不匹配,然后匹配模式。

它不需要包含“unstable”并以“.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"))')
...

正如您所看到的,我尝试首先获取正确的下载网址,然后再在下一行中执行curl 下载命令。

我已经尝试过,但我只是无法弄清楚匹配函数的正则表达式是什么。
我仍然没有得到任何结果、语法错误或包含不稳定的行。

#!/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
}

相关内容