[英]JQ Loop over Bash array add elements
我似乎無法找到答案,但已經看到足夠多的信息,知道可能有更好的方法來做我想做的事情。
問題:我有一個 bash 數組。 對於 bash 數組中的每個元素,我想更新一個 JSON 數組。
JSON 如下所示。 我想更新水果數組。
"foods": {
"perishable": {
"fruit": []
我會得到一個長度為n的數組,例如:
fruit_array=("banana" "orange")
它應該看起來像這樣:
"foods": {
"perishable": {
"fruit": [
{
"001": {
"002": "banana"
}
},
{
"001": {
"002": "orange"
}
}
]
有這樣做的好方法嗎? 目前我正在嘗試以下操作:
#!/bin/bash
fruit_array=("banana" "orange")
for fruit in "${fruit_array[@]}"; do
jq \
--arg fruit $fruit \
'.foods.perishables.fruit += [{"001": {"002": $fruit}}]' \
template.json > template_with_fruit.json
done
由於模板正在重新讀取的明顯原因,這不起作用,但我搞砸了讓它消耗前一次迭代的 output,但最后沒有任何結果。 我只能更新一次模板。
但是,我知道這似乎有點狡猾,並且懷疑有更清潔、更jq的方式。
以前的 - 中止 - 嘗試是這樣的:
jq \
--argjson fruit "$(printf '{"001": {"002": "%s"}}\n' \"${fruit_array[@]}\" | jq -nR '[inputs]')" \
'.foods.perishables.fruit += $fruit' \
這產生了一個轉義字符串,我對此無能為力,但至少暗示了標准 bash 循環可能有更簡潔的解決方案。
我錯過了一些東西。
一如既往,我們將不勝感激任何幫助。
JQ 可以自己完成所有這些; 你不需要循環或任何東西。
jq '.foods.perishable.fruit += (
$ARGS.positional
| map({"001": {"002": .}})
)' template.json --args "${fruit_array[@]}" >template_with_fruit.json
如果將數組作為空格分隔的字符串傳遞,則可以像這樣使用 JQ:
jq --arg fruits "$fruit_array" \
'.foods.perishable.fruit |= ($fruits | split(" ") | map({ "001": { "002": . } }))' input
{
"foods": {
"perishable": {
"fruit": [
{
"001": {
"002": "banana"
}
},
{
"001": {
"002": "orange"
}
}
]
}
}
}
使用printf
一次創建整個 json 字符串:
fruit_array=("banana" "orange")
printf -v fruits '{"001": {"002": %s}},' "${fruit_array[@]}"
$ echo $fruits
{"001": {"002": banana}},{"001": {"002": orange}},
然后將其添加到您的模板中,刪除最后一個逗號:
$ echo ${fruits%,}
{"001": {"002": banana}},{"001": {"002": orange}}
“數字”也可以這樣設置:
fruit_array=("1 2 banana" "3 4 orange")
printf '{"%.3d": {"%.3d": %s}},' ${fruit_array[@]}
{"001": {"002": banana}},{"003": {"004": orange}},
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.