複数行のカール実行で複数行変数を連結して使用する

複数行のカール実行で複数行変数を連結して使用する

このコードを使うと

#!/bin/bash
set -x
PROPERTIES="MAINTAINER=Self, My"

while IFS='=' read -r key value
do
  ADDITIONAL_PARAMETERS+="-F variables[${key}]=${value} "
done <<< "${PROPERTIES}"
#ADDITIONAL_PARAMETERS="$(echo -e "${ADDITIONAL_PARAMETERS}" | sed -e 's/[[:space:]]*$//')"

curl -k -X POST -F token=TOKEN -F "ref=master" \
-F "variables[GIT_REF]=GIT_REF" \
-F "variables[GIT_COMMIT]=GIT_COMMIT" \
${ADDITIONAL_PARAMETERS} \
https://gitlab.url.net

不明ないくつかのプロパティをビルドパラメータとしてGitLabパイプラインに渡そうとします。

問題は、引用符が間違った場所に生成され、次の呼び出しとエラーが発生するようです。

+ curl -k -X POST -F token=TOKEN -F ref=master -F 'variables[GIT_REF]=GIT_REF' -F 'variables[GIT_COMMIT]=GIT_COMMIT' -F 'variables[MAINTAINER]=Self,' My https://gitlab.url.net
curl: (6) Couldn't resolve host 'My'
curl: (6) Couldn't resolve host 'gitlab.url.net

一重引用符はどこから来たのですか?変数の途中に2番目の引用があるのはなぜですか?-F 'variables[MAINTAINER]=Self,' My

答え1

あなた本物次のタスクを実行するには配列を使用する必要があります。http://mywiki.wooledge.org/BashFAQ/050

#!/bin/bash
properties="MAINTAINER=Self, My"

curl_opts=(
    -k 
    -X POST 
    -F token=TOKEN 
    -F "ref=master" 
    -F "variables[GIT_REF]=GIT_REF" 
    -F "variables[GIT_COMMIT]=GIT_COMMIT" 
)

while IFS='=' read -r key value; do
    curl_opts+=( -F "variables[$key]=$value" )
done <<< "$properties"

curl "${curl_opts[@]}" https://gitlab.url.net

私の考えでは、このコードが正確であるだけでなく、読みやすくなります。

また、ALL_CAPS_VARNAMESを使用しないでください。これをシェル予約として扱います。

答え2

set -x出力を再利用できるように単一引用符を追加します。

を引用する必要があります${ADDITIONAL_PARAMETERS}"${ADDITIONAL_PARAMETERS}"それ以外の場合は、単語の区切りとファイル名拡張の影響を受けます。噴射があなたに起こります:

variables[MAINTAINER]=Self, My

次のように分割されます。

variables[MAINTAINER]=Self,

そして:

My

curlコマンドに渡されるからです。

関連情報