저는 Bash를 사용하여 Linux 시스템에서 다음 스크립트 조각을 실행하고 있습니다.
JSON 파일 콘텐츠:[ { "id": 123456, "firstName": "John", "lastName": "Smith", "email": "[email protected]" } ]
JSON 파일은 ${data[0]}
Bash 스크립트로 파이프되는 배열에 저장됩니다.
쿵쿵 스크립트:
trafficEmployeeId=123456 cat "${data[0]}" | jq --arg employeeId $trafficEmployeeId '.[] | select(.id == $employeeId) | .firstName'
스크립트의 출력은 이어야 John
하지만 아무것도 얻지 못합니다.
답변1
trafficEmployeeId
쉘 변수 를숫자그것은 jq
역할을 할 것입니다끈토론.
해결책은 매개변수를 다음과 같이 구문 분석하는 것입니다.숫자그리고잭~의tonumber
기능.
두 번째는 data[0]
객체가 하나만 포함된 배열이므로 직접 사용 .[0]
하고 간단한 if
연산자 조건을 적용하는 것으로 충분합니다.
완벽한 솔루션:
trafficEmployeeId=123456
echo "${data[0]}" | jq --arg employeeId "$trafficEmployeeId" '.[0]
| if .id == ($employeeId | tonumber) then .firstName else empty end'
산출:
"John"
답변2
코드의 주요 문제는 코드를 매개변수로 호출한다는 것입니다 cat
. 그러면 이 이름을 가진 파일을 열려고 시도 ${data[0]}
하게 됩니다 . cat
이것은 아마도 "JSON 파일이 배열에 저장되어 있다 ${data[0]}
"는 의미일 것입니다. 그러나 이것이 의미하는 경우 파일은 다음과 같습니다.문자 그대로printf
배열 에 저장된 경우 jq
.
$employeeId
숫자(JSON 문서의)를 문자열(표현식 의 값 ) 과 비교하려고 하면 jq
추가 문제가 있습니다 . 이 문제는 대신 를 사용하면 --argjson
쉽게 해결할 수 있습니다 --arg
. 를 사용하면 생성한 변수의 값이 이미 적절하게 JSON으로 인코딩된 것으로 가정합니다 --argjson
.jq
수정된 스크립트는 다음과 같습니다.
#!/bin/sh
id=123456
jq --argjson id "$id" '.[] | select(.id == $id).firstName' file.json
또는 다음 값을 사용하려는 경우 ${data[0]}
:
#!/bin/bash
# other code here setting data[0] to some JSON document data.
id=123456
printf '%s\n' "${data[0]}" |
jq --argjson id "$id" '.[] | select(.id == $id).firstName'
쿼리가 사용자 입력이나 다른 외부 프로세스에서 오는 경우 표현식과 비교하기 위해 문서의 값을 문자열로 계속 사용하고 변환하는 것이 id
더 안전할 수 있습니다 .--arg
select()
jq --arg id "$id" '.[] | select((.id|tostring) == $id).firstName'