다음과 같은 JSON 파일이 있습니다.
{
"name" : "Allow",
"source" : [ "*" ,"0.0.0.0"]
}
JSON의 문자열 배열을 "공백으로 구분된 문자열"로 변환할 수 있도록 이 JSON을 구문 분석해야 합니다. 나중에 이 변수를 다음과 같은 다른 함수에 제공해야 합니다.
local file="file-name"
while read val; do
local name
local source
name=$(jq --raw-output '.name' <<< ${val})
source=$(jq --raw-output '.source' <<< ${val})
__test "${name}" "${source}"
done < <(cat ${file} | jq -rc '.[]')
따라서 기본적으로 소스를 문자열로 변경하고 문자열 목록 대신 전달해야 합니다.
답변1
join(" ")
일반적으로 in을 사용하여 배열 요소를 공백으로 구분된 단일 문자열로 변환할 수 있습니다 jq
. 귀하의 경우 .source
해당 배열을 공백으로 구분된 string 으로 변환하는 데 사용할 수 있습니다 .source | join(" ")
.
귀하의 입력 문서에 귀하의 질문에 표시된 유형의 개체 배열이 포함되어 있다고 가정합니다.
jq
반복할 때마다 여러 번 호출하는 대신 을 사용하여 jq
데이터를 단일 스트림으로 사용할 수 있는 형식으로 변환하는 것을 고려해 보세요.
jq -r '.[] | [ .name, (.source | join(" ")) ] | @tsv' file.json |
while IFS=$'\t' read -r name source; do
__test "$name" "$source"
done
그러면 루프에 탭으로 구분된 두 개의 필드가 제공됩니다. 첫 번째 필드는 .name
JSON 문서의 값이고, 두 번째 필드는 배열의 요소를 연결하여 형성된 공백으로 구분된 문자열입니다 .source
. join()
배열 요소를 단일 문자열로 연결하고 jq
배열을 제공하여 탭으로 구분된 출력을 생성하려면 in을 사용합니다 .@tsv
용기가 있다면 사용해도 됩니다
eval "$( jq -r '.[] | [ "__test", .name, (.source | join(" ")) ] | @sh' file.json )"
jq
이는 실행하려는 쉘 명령을 실제로 생성하는 데 사용됩니다 . 그런 다음 쉘을 호출하여 이것을 얻으십시오.스크립트문자열로 변환하고 eval
. jq
표현식 에서 @sh
명령 이름과 해당 인수에 대한 올바른 참조를 제공하는 데 사용됩니다. 여기의 표현식에는 jq
질문에 표시된 유형의 객체 배열이 필요합니다.