안녕하세요, 게시물에서 작업을 생성하기 위해 파이프 컬 방법을 사용하고 있습니다. 하드코딩된 값을 사용하여 터미널에서 실행하면 정상적으로 작동합니다. 하지만 변수를 사용하여 실행하려고 하면 오류가 발생합니다.
스크립트:
#!/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
생성하여 배열 요소를 만듭니다.jq
type
value
transactions
jq
그런 다음 결과 개체는 다른 호출(루프에서 읽기)을 통해 배열에 삽입 됩니다. 그러면 최종 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 문서를 생성하여 에 전달합니다 .high
ahsan
arc
{
"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"
}
]
}
큰따옴표는 모두 올바르게 처리됩니다.