여러 줄 컬 실행에서 여러 줄 변수 연결 및 사용

여러 줄 컬 실행에서 여러 줄 변수 연결 및 사용

이 코드를 사용하면

#!/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명령 에 전달되기 때문입니다 .

관련 정보