使用curl编写Github文件下载脚本,其中文件名和路径是可变的

使用curl编写Github文件下载脚本,其中文件名和路径是可变的

我需要编写安装脚本数字海洋命令行界面”文档“工具来自吉图布使用卷曲,但有一个问题:文件名随着版本号的变化而变化,因此硬编码需要在每次发布新版本时编辑脚本,从而否定了自动化的全部意义!

仅在变量目录和文件名的路径中使用星号(或某些人所说的“星星”)进行通配是行不通的。

我必须使用的路径:

https://github.com/digitalocean/doctl/releases/download/v1.15.0/doctl-1.15.0-linux-amd64.tar.gz

正如您所看到的,甚至文件所在的目录也因版本号而异。

我将展示解决问题的方法,这可能不是最优雅的解决方案。如果你有更简洁的,请分享!

答案1

像以前一样执行curl -sL(放下进度条并遵循重定向),但为其提供最新 linux-amd64 版本的 URL:

curl -sL "$(curl -L -s https://api.github.com/repos/digitalocean/doctl/releases/latest |
  jq -r '.assets[] | select(.name | contains("-linux-amd64.tar.gz")).browser_download_url')" |
    tar -xzv

内部命令替换向 github API 询问该存储库的最新版本;然后它通过管道jq选择名称包含该字符串的元素-linux-amd64.tar.gz并返回下载 URL。

答案2

我将路径分为 (3) 部分:

  1. 非可变基数:路径中 100% 可预测且不会在未来发生变化的部分

https://github.com/digitalocean/doctl/releases/download/

  1. 变量目录名称:目录的名称是版本号。因此,尽管它是可变的,但它仍然是可预测的,因为它使用语义版本控制(https://semver.org/):

v$(curl -s https://github.com/digitalocean/doctl/releases/ | grep -om 1 'doctl-.*-linux-amd64.tar.gz'|grep -Eo '[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}')/

操作是找到最新的文件并从中提取版本号。自从“v" 目录名不是文件名的一部分,它不能被捕获grep。所以我只是在自填充变量前面进行了硬编码

  1. 变量文件名:以下表达式的操作仅提取最新版本(“米1”部分)文件名:

$(curl -s https://github.com/digitalocean/doctl/releases/ | grep -om 1 'doctl-.*-linux-amd64.tar.gz')

整个丑陋的东西看起来如下(带有“|焦油-xzv“ 钉在最后):

curl -sL https://github.com/digitalocean/doctl/releases/download/v$(curl -s https://github.com/digitalocean/doctl/releases/ | grep -om 1 'doctl-.*-linux-amd64.tar.gz'|grep -Eo '[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}')/$(curl -s https://github.com/digitalocean/doctl/releases/ | grep -om 1 'doctl-.*-linux-amd64.tar.gz') | tar -xzv

此下载将继续成功,无需手动编辑脚本(在未来版本中文件和目录名称发生更改)。

同样,这可能不是最优雅的解决方案,但可以有效地解决问题。如果您有更好的方法,欢迎分享! HTH-

相关内容