created=$(curl -i -X POST -H 'Content-Type:application/json' --data "$(payload)" https://myurl/resource)
위의 내용은 json 객체를 반환합니다.
{
"revision": {
"clientId": "",
"version": 1,
"lastModifier": "admin"
},
"id": "idvalue",
"uri": "https://myurl/idvalue",
"position": {
"x": 100,
"y": 200
}
}
위의 객체에서 ID를 얻으려면 다음 코드를 사용하고 있습니다.
idvar=$(echo $created | jq ' .id' )
하지만 위의 내용은 다음과 같은 오류를 발생시킵니다.
parse error: Invalid numeric literal at line 1, column 9
답변1
( )를 사용하여 이러한 헤더를 요청했으므로 의 응답에는 curl
HTTP 헤더가 포함됩니다 . 이는 변수의 내용에 HTTP 헤더와 일부 JSON이 포함된다는 의미입니다.-i
--include
created
도구 jq
는 HTTP 헤더를 구문 분석할 수 없으므로 불평합니다. 표준 HTTP 응답 헤더는 다음과 같이 시작합니다 HTTP/1.1 200 OK
. "라인 1, 열 9" 위치는 정확히 문자열의 첫 번째 공백 문자가 있는 위치이며, 여기서 JSON 파서는 포기하고 오류를 보고합니다.
호출에서 해당 -i
옵션을 제거하면 curl
코드가 작동하게 됩니다. 하지만 키 값만 필요한 경우에는 실제로 중간 변수에 id
출력을 저장할 필요가 없습니다 .curl
curl -X POST \
--header 'Content-Type:application/json' \
--data "$json_document" \
'https://myurl/resource' | jq -r .id
하지만 그래도 이 작업을 수행해야 한다면 기억하세요.
echo
임의의 데이터, 특히 백슬래시 문자가 포함된 JSON(많은echo
구현에서 중단됨) 을 출력 하는 데 사용할 수 없습니다 .- zsh1을 제외한 Bourne과 유사한 쉘에서는 분할+glob을 방지하기 위해 매개변수 확장을 인용해야 합니다.
따라서 다음과 같아야 합니다.
printf %s "$created" | jq -r .id
zsh
1 그러나 인용해서 나쁠 것은 없습니다.
답변2
쿼리 문자열에서 공백을 제거하면 작동합니다.
$ idvar=$(echo $created | jq '.id' )
$ echo $idvar
"idvalue"
$
JMESpath에서 jp를 사용하는 것을 고려해 보겠습니다(https://github.com/jmespath/jp) 더 정확하게 정의된 언어 구문을 갖고 있기 때문입니다.
$ echo $created | jp "id"
"idvalue"
$