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" )"