
次の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
その配列をスペースで区切られた文字列に変換するために使用できます.source | join(" ")
。
入力文書に、質問に表示されたタイプのオブジェクトの配列が含まれているとします。
jq
繰り返すたびに複数回呼び出すのではなく、を使用してjq
データを単一のストリームとして使用できる形式に変換することを検討してください。
jq -r '.[] | [ .name, (.source | join(" ")) ] | @tsv' file.json |
while IFS=$'\t' read -r name source; do
__test "$name" "$source"
done
これにより、ループにタブ区切りの2つのフィールドが表示されます。最初のフィールドは.name
JSON文書の値であり、2番目のフィールドは配列の要素を連結して形成されたスペースで区切られた文字列です.source
。join()
配列要素を単一の文字列に連結し、配列をjq
提供してタブ区切りの出力を生成するには、inを使用します。@tsv
勇気があれば使ってもいい
eval "$( jq -r '.[] | [ "__test", .name, (.source | join(" ")) ] | @sh' file.json )"
jq
これは、実行したいシェルコマンドを実際に生成するために使用されます。その後、シェルを呼び出してこれを取得します。スクリプト文字列に変換してeval
。jq
式は、@sh
コマンド名とその引数への正しい参照を提供するために使用されます。ここの式には、jq
質問に示されている型のオブジェクトの配列が必要です。