컬 명령에서 bash 변수를 구문 분석할 수 없습니다.

컬 명령에서 bash 변수를 구문 분석할 수 없습니다.

안녕하세요, 게시물에서 작업을 생성하기 위해 파이프 컬 방법을 사용하고 있습니다. 하드코딩된 값을 사용하여 터미널에서 실행하면 정상적으로 작동합니다. 하지만 변수를 사용하여 실행하려고 하면 오류가 발생합니다.

스크립트:

#!/bin/bash
echo "$1"
echo "$2"
echo "$3"
echo "$4"
echo "$5"
echo '{
  "transactions": [
    {
      "type": "title",
      "value": "$1"
    },
    {
      "type": "description",
      "value": "$2"
    },
    {
      "type": "status",
      "value": "$3"
    },
    {
      "type": "priority",
      "value": "$4"
    },
    {
       "type": "owner",
       "value": "$5"
    }
  ]
}' | arc call-conduit --conduit-uri https://mydomain.phacility.com/ --conduit-token mytoken maniphest.edit

구현하다:

./test.sh "test003 ticket from api post" "for testing" "open" "high" "ahsan"

산출:

test003 ticket from api post
for testing
open
high
ahsan
{"error":"ERR-CONDUIT-CORE","errorMessage":"ERR-CONDUIT-CORE: Validation errors:\n  - User \"$5\" is not a valid user.\n  - Task priority \"$4\" is not a valid task priority. Use a priority keyword to choose a task priority: unbreak, very, high, kinda, triage, normal, low, wish.","response":null}

오류에서 볼 수 있듯이 $4와 $5를 변수가 아닌 값으로 읽습니다. $variables를 이러한 매개변수의 입력으로 사용하는 방법을 이해할 수 없습니다.

답변1

여기서 문제는 작은따옴표를 사용하고 있다는 것입니다. 쉘에 의한 변수 확장을 방지합니다. 대신 큰따옴표를 사용하거나(내부 큰따옴표를 이스케이프 처리) 변수 $X 주위에 작은따옴표를 추가하세요.

예를 들어 다음 명령을 비교해 보세요.

$ test_var="wiii" && echo '"$test_var"'
"$test_var"

이:

$ test_var="wiiii" && echo "\"$test_var\""
"wiiii"

이:

$ test_var="wiiii" && echo '"'$test_var'"'
"wiiii"

읽어야 할 추가 정보:

답변2

주요 문제는 쉘이 작은 따옴표로 변수를 확장하지 않는다는 것입니다. 또한 사용자가 제공한 원시 데이터를 인코딩하지 않고 JSON 문서에 직접 삽입하는 문제도 있습니다.

우리는 이렇게 함으로써 이를 수행할 수 있습니다.jq사용자 제공 데이터를 인코딩합니다.

#!/bin/sh

if [ "$#" -ne 5 ]; then
    printf 'Expected 5 arguments, got %d\n' "$#" >&2
    exit 1
fi

for type in title description status priority owner
do
        jq -n --arg type "$type" --arg value "$1" '{ type: $type, value: $value }'
        shift
done | jq -c -s '{ transactions: . }' |
arc call-conduit \
        --conduit-uri 'https://mydomain.phacility.com/' \
        --conduit-token 'mytoken' \
        maniphest.edit

스크립트는 명령줄 인수를 사용하고 적절한 콘텐츠가 포함된 a 및 a 키가 포함된 개체를 transactions생성하여 배열 요소를 만듭니다.jqtypevalue

transactionsjq그런 다음 결과 개체는 다른 호출(루프에서 읽기)을 통해 배열에 삽입 됩니다. 그러면 최종 JSON 문서가 생성되어 arc명령에 전달됩니다.

조금 더 길고 복잡해 보이기보다는

jq -n --arg type "$type" --arg value "$1" '{ type: $type, value: $value }'

루프 본문에서 사용할 수 있습니다jo도구이와 같이:

jo type="$type" value="$1"

jo호출과 원래 호출 모두 (루프 변수) 및 (사용자 제공 명령줄 인수)가 적절하게 JSON으로 인코딩되었는지 jq확인합니다 .$type$1

5개의 매개변수 "test003" ticket from api post, for "testing", 및 가 open주어 지면 이 코드는 다음 문서와 동일한 JSON 문서를 생성하여 에 전달합니다 .highahsanarc

{
  "transaction": [
    {
      "type": "title",
      "value": "\"test003\" ticket from api post"
    },
    {
      "type": "description",
      "value": "for \"testing\""
    },
    {
      "type": "status",
      "value": "open"
    },
    {
      "type": "priority",
      "value": "high"
    },
    {
      "type": "owner",
      "value": "ahsan"
    }
  ]
}

큰따옴표는 모두 올바르게 처리됩니다.

관련 정보