このコードを使うと
#!/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
コマンドに渡されるからです。