컬 jq는 필드 이름에서 값을 가져옵니다

컬 jq는 필드 이름에서 값을 가져옵니다
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

( )를 사용하여 이러한 헤더를 요청했으므로 의 응답에는 curlHTTP 헤더가 포함됩니다 . 이는 변수의 내용에 HTTP 헤더와 일부 JSON이 포함된다는 의미입니다.-i--includecreated

도구 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

zsh1 그러나 인용해서 나쁠 것은 없습니다.

답변2

쿼리 문자열에서 공백을 제거하면 작동합니다.

$ idvar=$(echo $created | jq '.id' )
$ echo $idvar
"idvalue"
$

JMESpath에서 jp를 사용하는 것을 고려해 보겠습니다(https://github.com/jmespath/jp) 더 정확하게 정의된 언어 구문을 갖고 있기 때문입니다.

$ echo $created | jp "id"
"idvalue"
$

관련 정보