有了这个代码
#!/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
单引号从何而来?为什么第二个引号位于变量中间?-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:将它们视为 shell 保留的。
答案2
set -x
添加单引号,以使输出可重用。
您需要引用${ADDITIONAL_PARAMETERS}
,"${ADDITIONAL_PARAMETERS}"
否则它会受到分词和文件名扩展的影响。分词发生在你身上:
variables[MAINTAINER]=Self, My
被分成:
variables[MAINTAINER]=Self,
和:
My
因为它被传递给curl
命令。