cURL、jq、ステートメント、およびforループ条件を使用してGitLabプライベートストアから複数のファイルをダウンロードしようとしていますが、1つだけダウンロードされます。

cURL、jq、ステートメント、およびforループ条件を使用してGitLabプライベートストアから複数のファイルをダウンロードしようとしていますが、1つだけダウンロードされます。

私は次のソースからこれを学びました。

スクリプトの説明:

  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

ただし、これら2つの条件forループはエンコードされたパスのみを出力し、ファイルのみをダウンロードします。

答え1

paths最初のループは各反復で変数値を上書きします。後でこれが配列になりたいので、正しく作成されたことを確認してください。

paths=()
for urlencode in "${context_dirs[@]}"; do
  paths+=( "$(jq -nr --arg v "$urlencode" '$v|@uri')" )
done

または、2つのループを組み合わせます。

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

関連情報