Bash에서 다차원 json 배열을 반복하고 싶지만 아직 해결책을 찾지 못했습니다.
다차원 배열은 다음과 같습니다.
{
"FILES": [
[ "file1.yaml", "file2.yaml", "file3.yaml" ],
[ "file1.json", "file2.json" ]
]
}
각 배열을 결국 명령의 입력이 될 문자열로 변환하고 싶습니다.
그래서 이렇게 :
#!/bin/bash
Json_Array=$(cat <<EOF
{
"FILES": [
[ "file1.yaml", "file2.yaml", "file3.yaml" ],
[ "file1.json", "file2.json" ]
]
}
EOF
)
function runCmd ()
{
echo "command $1"
}
function runCmds ()
{
jq -c '.FILES' <<< "$Json_Array" | while read i; do
runCmd "$(echo $i | jq .)"
done
}
runCmds
따라서 출력은 다음과 같아야 합니다.
command file1.yaml file2.yaml file3.yaml
command file1.json file2.json
어떤 도움을 주셔서 감사합니다!
답변1
각 배열의 시작 부분에 옵션과 함께 명령을 삽입한 다음 각 배열을 전달하여 @sh
셸 코드를 만듭니다. 쉘 코드를 평가하십시오.
-a
여기에서는 명령( 및 )에 -b hello
추가 인수를 삽입하는 방법도 보여줍니다 .
eval "$( jq -r '.FILES | map([ "command", "-a", "-b", "hello", .[] ])[] | @sh' file.json )"
질문에 JSON이 주어지면 셸에서 다음 명령이 실행됩니다.
'command' '-a' '-b' 'hello' 'file1.yaml' 'file2.yaml' 'file3.yaml'
'command' '-a' '-b' 'hello' 'file1.json' 'file2.json'
JSON 문서가 변수에 있는 경우 다음을 $json
사용하세요 .
eval "$( jq -r '.FILES | map([ "command", "-a", "-b", "hello", .[] ])[] | @sh' <<<"$json" )"