나는 다음 소스에서 이것을 배웠습니다.
curl -O
:Linux/Unix 명령줄에서 컬을 사용하여 파일 다운로드- jq: 컬 명령에 대한 데이터를 urlencode하는 방법은 무엇입니까?
- 여러 파일 및
curl -J
: 컬을 사용하여 PDF 파일 다운로드 - 조건부
for
루프: Shell: 조건에 2개의 변수를 사용하는 방법그리고컬 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
얻은 여러 파일을 다운로드하기 위해 조건부 루프를 사용하고 있습니다 . 중요한 것은 파일 이름을 다음 용도로 사용하고 출력한다는 것입니다.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