현재 JSON 구조가 필요한 API를 통해 데이터를 푸시하는 중 문제가 발생했습니다. 다음과 같이 작성한 파일에서 값을 읽어야 합니다.
file="/value"
name=$(cat "$file")
따라서 $name은 값 파일 내부의 콘텐츠에 대한 변수이며 잘 작동합니다. 데이터를 푸시해야 할 때 문제가 발생합니다.
cos -u https://myapi.com push data '{
"sec": 0,
"usage": 0,
"actions": [
{
"name": "transfer",
"data": {
"from": "test",
"to": "test2",
"value": $name,
"message": ""
},
"값" 개체의 이름을 읽는 변수를 어떻게 정의합니까?
답변1
파일의 데이터가 원시 문자열로 처리되어야 한다고 가정하면 JSON으로 인코딩되어야 합니다. 이는 다음과 같이 JSON을 이해하는 프로그램을 사용하여 가장 쉽게 수행할 수 있습니다 jq
.
json='
{
"actions": [
{
"data": { "from": "test", "message": "", "to": "test2" },
"name": "transfer"
}
],
"sec": 0,
"usage": 0
}
'
json=$( jq --arg value "$(cat "$file")" '.actions[0].data.value = $value' <<<"$json" )
cos -u 'https://myapi.com' push data "$json"
$value
표현식 에는 jq
쉘 변수가 없지만 값 jq
이 명령줄에 제공되고 --arg
자동으로 JSON으로 인코딩되는 내부 변수가 있습니다.
데이터를 처리하는 좀 더 편리한 방법은 $file
명령줄에서 데이터를 확장하지 않고(데이터가 큰 경우 중요할 수 있음) 데이터를 개별적으로 JSON 문자열로 변환하고 이를 삽입하는 jq
메서드 에 전달하는 것입니다. 프로세스별 올바른 위치:
jq '.actions[0].data.value = input' - <( jq -Rs . data ) <<<"$json"
파일에서 읽은 키 값으로 객체를 jo
생성한 data
다음 셸 변수를 사용하여 객체를 삽입할 수도 있습니다.value
$file
datajson=$( jo from=test message="" to="test2" value=@"$file" )
json='
{
"actions": [
{
"data": '"$datajson"',
"name": "transfer"
}
],
"sec": 0,
"usage": 0
}
'
cos -u 'https://myapi.com' push data "$json"
삽입을 위해 JSON 문서를 구성하는 작은따옴표 문자열을 일시적으로 분리하는 방법에 주목하세요 $datajson
.