我想在 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
以创建 shell 代码。评估 shell 代码。
在这里,我还展示了如何向命令 (-a
和-b hello
) 插入额外的参数:
eval "$( jq -r '.FILES | map([ "command", "-a", "-b", "hello", .[] ])[] | @sh' file.json )"
给定问题中的 JSON,这将在 shell 中执行以下命令:
'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" )"