컬: bash에 문자열을 옵션으로 추가

컬: bash에 문자열을 옵션으로 추가

컬의 명령 옵션에 변수 문자열을 전달하고 싶습니다.

if [ ! -z ${picture} ]; then APISTRING+="--data-urlencode \"picture=${picture}\" ";fi
if [ ! -z ${additional} ]; then APISTRING+="--data-urlencode \"additional_info="${additional}"\" ";fi

따라서 그림과 추가 항목이 비어 있지 않은 경우 $APISTRING은 다음과 같아야 합니다.

--data-urlencode "picture=someinfo"  --data-urlencode "additional_info=additional infos here"

하지만 컬을 호출할 때

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" "${APISTRING}"

다음과 같은 오류가 발생합니다.

컬: 옵션 --data-urlencode "picture=someinfo" --data-urlencode "additional_info=여기에 추가 정보": 알 수 없음

누구든지 이것을 처리하는 방법을 알고 있습니까?

답변1

변수 값에 따옴표를 삽입하는 것은 APISTRING+="--data-urlencode \"picture=${picture}\" "제대로 작동하지 않습니다. 를 사용하려고 하면 $APISTRINGbash는 변수 값을 확장하기 전에 따옴표를 구문 분석하고 확장 후에는 "새" 따옴표를 다시 검색하지 않습니다. 결과적으로 따옴표는 문자열 주위의 구분 기호가 아닌 문자열의 일부로 처리됩니다.

이와 같은 문제에 대한 가장 좋은 해결책은 배열을 사용하여 명령 옵션을 저장하는 것입니다.

APISTRING=()
if [ ! -z ${picture} ]; then APISTRING+=(--data-urlencode "picture=${picture}");fi
if [ ! -z ${additional} ]; then APISTRING+=(--data-urlencode "additional_info=${additional}");fi
curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" "${APISTRING[@]}"

#!/bin/bash모든 POSIX 셸에서 배열을 사용할 수 있는 것은 아니므로 명시적으로 bash를 사용하는 스크립트(예: 또는 의 shebang)에서만 이를 사용해야 합니다 #!/usr/bin/env bash.~ 아니다 #!/bin/sh). 또한 구문은 매우 까다롭습니다. 할당, 큰따옴표 또는 [@]배열 확장 시 괄호를 빼지 마십시오.

그런데 또 다른 가능한 해결책이 있습니다. 선택적 옵션을 미리 축적하는 대신 다음을 사용할 수 있습니다.조건부 확장그 자리에서 포함시키려면:

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" \
    ${picture:+ --data-urlencode "picture=${picture}"} \
    ${additional:+ --data-urlencode "additional_info=${additional}"}

여기서 :+확장은 bash에게 변수가 비어 있지 않은지 확인하고 변수를 사용하지 않는 경우 대체 값(적절한 접두사가 있는 인용된 변수 버전)을 사용하도록 지시합니다.

답변2

"${APISTRING}"에 불필요한 따옴표가 있습니다.

고치다:

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" ${APISTRING}

관련 정보