![使用 cURL、jq、声明和 for 循环条件,我尝试从 GitLab 私有存储库下载多个文件,但它只下载了一个](https://linux22.com/image/174322/%E4%BD%BF%E7%94%A8%20cURL%E3%80%81jq%E3%80%81%E5%A3%B0%E6%98%8E%E5%92%8C%20for%20%E5%BE%AA%E7%8E%AF%E6%9D%A1%E4%BB%B6%EF%BC%8C%E6%88%91%E5%B0%9D%E8%AF%95%E4%BB%8E%20GitLab%20%E7%A7%81%E6%9C%89%E5%AD%98%E5%82%A8%E5%BA%93%E4%B8%8B%E8%BD%BD%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BD%86%E5%AE%83%E5%8F%AA%E4%B8%8B%E8%BD%BD%E4%BA%86%E4%B8%80%E4%B8%AA.png)
我从以下来源了解到:
curl -O
:在 Linux / Unix 命令行上使用curl下载文件- jq: 如何为curl命令对数据进行urlencode?
- 多个文件和
curl -J
: 使用curl下载pdf文件 - 条件
for
循环: Shell:如何在 for 条件中使用 2 个变量和无法使用curl for循环下载数据
脚本说明:
变量,GitLab 所需的存储库文件 API:
branch="master" repo="my-dotfiles" private_token="XXY_wwwwwx-qQQQRRSSS" username="gusbemacbe"
我对多个文件使用了声明:
declare -a context_dirs=( "home/.config/Code - Insiders/Preferences" "home/.config/Code - Insiders/languagepacks.json" "home/.config/Code - Insiders/rapid_render.json" "home/.config/Code - Insiders/storage.json" )
我使用条件
for
循环将jq
所有文件从声明转换context_dirs
为编码 URL:for urlencode in "${context_dirs[@]}"; do paths=$(jq -nr --arg v "$urlencode" '$v|@uri') done
我使用条件
for
循环来下载从转换后curl
获取的多个文件。重要的是我使用和来输出文件名,并且for :paths
jq
-0
-J
-H
"PRIVATE-TOKEN: $private_token"
for file in "${paths[@]}"; do curl -sLOJH "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$username%2F$repo/repository/files/$file/raw?ref=$branch" done
完整源代码:
branch="master"
id="1911000X"
repo="my-dotfiles"
private_token="XXY_wwwwwx-qQQQRRSSS"
username="gusbemacbe"
declare -a context_dirs=(
"home/.config/Code - Insiders/Preferences"
"home/.config/Code - Insiders/languagepacks.json"
"home/.config/Code - Insiders/rapid_render.json"
"home/.config/Code - Insiders/storage.json"
)
for urlencode in "${context_dirs[@]}"; do
paths=$(jq -nr --arg v "$urlencode" '$v|@uri')
done
for file in "${paths[@]}"; do
curl -sLOJH "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$username%2F$repo/repository/files/$file/raw?ref=$branch"
done
但这两个条件for
循环仅输出编码路径并仅下载文件。
答案1
paths
第一个循环在每次迭代中覆盖变量的值。由于您稍后希望这是一个数组,因此请确保它已正确创建:
paths=()
for urlencode in "${context_dirs[@]}"; do
paths+=( "$(jq -nr --arg v "$urlencode" '$v|@uri')" )
done
或者,组合两个循环:
for urlencode in "${context_dirs[@]}"; do
file=$(jq -nr --arg v "$urlencode" '$v|@uri')
curl -sLOJH "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$username%2F$repo/repository/files/$file/raw?ref=$branch"
done