簡體   English   中英

JQ循環遍歷Bash數組添加元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM