在多行curl执行中连接并使用多行变量

在多行curl执行中连接并使用多行变量

有了这个代码

#!/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命令。

相关内容