jq - Assert는 정확히 1개의 요소를 반환합니다.

jq - Assert는 정확히 1개의 요소를 반환합니다.

다음 jq 스니펫을 사용하여 값 배열에서 키를 추출합니다.

jq '[.[].refreshToken | select(. != null)] | unique]'

1개의 요소만 반환되었다고 어떻게 주장합니까? 결과 배열에 2개 이상의 요소가 있는 경우 0이 아닌 상태 코드가 반환되기를 원합니다. 그렇지 않으면 결과 JSON 배열에 1개의 요소가 포함되어 있습니다.


   [{
      "tokenType":"Bearer",
      "expiresIn":3599,
      "expiresOn":"2021-09-28 17:41:15.929902",
      "resource":"https://management.core.windows.net/",      
      "accessToken":"lkZXIuZ2mn_A",
      "refreshToken":"0.AYIAGNEIQ9HtAEOq4v1k",
      "oid":"0000-ea77-4abe-961b-0000",
      "userId":"[email protected]",
      "isMRRT":true,
      "_clientId":"0000-0000-0000-0000",
      "_authority":"https://login.microsoftonline.com/common"
   }]

답변1

jq해당 (또는) 명령줄 옵션을 사용하면 마지막으로 평가된 값에 해당하는 종료 상태로 유틸리티가 종료되도록 할 수 있습니다 .--exit-status-e

jq -r -e '[.[] | select(.refreshToken != null)] | unique | if length == 1 then .[].refreshToken else empty end' file

위 표현식에서 평가된 마지막 문이 true이고 비어 있지 않으며 null이 아닌 경우 종료 상태는 jq0이 됩니다. 그렇지 않으면 0이 아닙니다.

주석은 우리가 찾고 있는 것이 refreshToken데이터라는 것을 나타냅니다. 단, 그것이 고유한 경우에만 해당됩니다. 당신은 이것을 할 수 있습니다

jq -r -e '[.[].refreshToken // empty] | unique | if length == 1 then .[] else empty end' file

답변2

해결됨:jq -r '([.[].refreshToken | select(. != null)] | unique) as $r | if $r | length == 1 then $r | .[] else null end'

관련 정보