이 코드를 사용하면
#!/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를 사용하지 마십시오. 이를 쉘 예약으로 처리하십시오.
답변2
set -x
출력을 재사용할 수 있도록 작은따옴표를 추가합니다.
를 인용해야 합니다 ${ADDITIONAL_PARAMETERS}
. "${ADDITIONAL_PARAMETERS}"
그렇지 않으면 단어 분리 및 파일 이름 확장의 영향을 받습니다. 분사가 당신에게 발생합니다 :
variables[MAINTAINER]=Self, My
다음과 같이 나누어집니다:
variables[MAINTAINER]=Self,
그리고:
My
curl
명령 에 전달되기 때문입니다 .