변수를 저장하고 이를 사용하여 파일에 대한 json 출력을 생성하는 스크립트가 있습니다. 이것은 내 json 빌드 형식입니다.
#!/bin/bash
JSON_STRING=$(jq -n \
--arg configId "$configid" \
--arg objectname "tempfile" \
--arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
--arg test "2021" \
'$ARGS.named') > output.json
필수 json o/p(output.json) -
{ "configId": "c8f", "objectname": "tempfile", "artifacts": [{ "name" : "oer", "version" : "1.01" }], "test" : "2021"}
여기서 예상되는 결과가 나오지 않습니다. 어떤 도움이라도 좋을 것입니다.
답변1
나는 두 단계로 그것을 할 것입니다: (편집: 아티팩트는 객체의 배열입니다)
inner=$(jq -n --arg name oer \
--arg version "$ot" \
'$ARGS.named'
)
final=$(jq -n --arg configId "$configid" \
--arg objectname "tempfile" \
--arg test "2021" \
--argjson artifacts "[$inner]" \
'$ARGS.named'
)
echo "$final"
{
"configId": "c8f",
"objectname": "tempfile",
"artifacts": [
{
"name": "oer",
"version": "1.01"
}
], "test": "2021"
}
-c
최종 출력을 한 줄로 만들려면 .
답변2
명령줄에서 JSON을 생성하는 가장 안전한 방법은 JSON을 구축하는 도구를 사용하는 것입니다 jq
. 그러나 중첩된 구조가 있으므로 별도의 호출로 jq
하위 구조를 생성할 수도 있습니다.글렌 잭맨이 연기한.
시연한 내용을 한 번에 달성하는 또 다른 방법은 다음과 같습니다.
jq -n \
--arg configId "$configid" \
--arg objectname tempfile \
--argjson artifacts "$(
jq -n \
--arg name oer \
--arg version "$ot" \
'$ARGS.named'
)" \
--arg test 2021 \
'$ARGS.named'
JSON 문서는 인코딩해야 하는 문자열이 아니라 JSON 문서이므로 내부에서 JSON 문서를 포함하는 --argjson
대신 사용합니다 .--arg
jq
를 사용하면 jo
약간의 입력 시간을 절약할 수도 있습니다.
jo configId="$configid" \
objectname=tempfile \
artifacts="$( jo name=oer version="$ot" )" \
test=2021
유틸리티에 대한 설명은 jo
여기에서 찾을 수 있습니다.https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/
답변3
출력을 변수에 저장하기 때문에 출력을 얻지 못하므로 파일로 리디렉션할 것이 없습니다. 다음을 수행할 수 있습니다.
variable=$(command)
아니면 이거:
command > file
variable=$(command) > file
하지만 리디렉션할 항목이 없기 때문에 그렇게 할 수 없습니다 . 따라서 위의 코드가 실행되어 생성 및/또는 덮어쓰더라도 file
명령의 출력을 변수에 저장했기 때문에 파일은 항상 비어 있습니다.
따라서 출력을 변수에 저장하고 파일에 저장하려면 다음과 같은 것이 필요합니다.
JSON_STRING=$(jq -n \
--arg configId "$configid" \
--arg objectname "tempfile" \
--arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
--arg test "2021" \
'$ARGS.named')
printf '%s\n' "$JSON_STRING" > output.json
답변4
artifacts
JSON 배열로 취급되기를 원하는 것 같습니다 . 이 경우 --argjson
대신 사용 --arg
하고 따옴표를 수정하세요.
jq -n \
--arg configId "$configid" \
--arg objectname "tempfile" \
--argjson artifacts "[{ \"name\" : \"oer\", \"version\" : \"$ot\" }]" \
--arg test "2021" \
'$ARGS.named'
결과는 다음과 같습니다.
{
"configId": "",
"objectname": "tempfile",
"artifacts": [
{
"name": "oer",
"version": "1.01"
}
],
"test": "2021"
}