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

ここでは、簡素化のために正しい否定/肯定的な背面/前方ビューを取得するのではなく、2つの個別のテストを実行します。また、正規表現が一致するかどうかを知りたい場合は、代わりに次のものを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文書を一時ファイルに保存してください。 3 回の解析を防ぐには、すべてのデータを一度に取り出します。

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
}

おすすめ記事