cURL, jq, 문 및 for 루프 조건을 사용하여 GitLab 개인 저장소에서 여러 파일을 다운로드하려고 하지만 하나만 다운로드됩니다.

cURL, jq, 문 및 for 루프 조건을 사용하여 GitLab 개인 저장소에서 여러 파일을 다운로드하려고 하지만 하나만 다운로드됩니다.

나는 다음 소스에서 이것을 배웠습니다.

스크립트 설명:

  1. GitLab에 필요한 변수리포지토리 파일 API:

    branch="master"
    repo="my-dotfiles"
    private_token="XXY_wwwwwx-qQQQRRSSS"
    username="gusbemacbe"
    
  2. 여러 파일에 대한 선언을 사용하고 있습니다.

    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"
    )
    
  3. 조건부 for루프를 사용하여 jq모든 파일을 선언에서 context_dirs인코딩된 URL로 변환합니다.

    for urlencode in "${context_dirs[@]}"; do
      paths=$(jq -nr --arg v "$urlencode" '$v|@uri')
    done
    
  4. for변환에서 curl얻은 여러 파일을 다운로드하기 위해 조건부 루프를 사용하고 있습니다 . 중요한 것은 파일 이름을 다음 용도로 사용하고 출력한다는 것입니다.pathsjq-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

관련 정보