我需要编写安装脚本数字海洋命令行界面”文档“工具来自吉图布使用卷曲,但有一个问题:文件名随着版本号的变化而变化,因此硬编码需要在每次发布新版本时编辑脚本,从而否定了自动化的全部意义!
仅在变量目录和文件名的路径中使用星号(或某些人所说的“星星”)进行通配是行不通的。
我必须使用的路径:
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) 部分:
- 非可变基数:路径中 100% 可预测且不会在未来发生变化的部分
https://github.com/digitalocean/doctl/releases/download/
- 变量目录名称:目录的名称是版本号。因此,尽管它是可变的,但它仍然是可预测的,因为它使用语义版本控制(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”部分)文件名:
$(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-