并非所有 JSON 数组元素都是使用 Bash 中的 jq 命令创建的

问题描述 投票:0回答:1

在 while 循环内,我尝试构建 json 对象并将它们添加到数组中,然后使用 jq 命令将此数组写入 json 文件。数组中的每个 json 对象从文件中获取其属性之一,如下所示:

input="names.csv" 
while IFS= read -r secretName || [ -n "$secretName" ]; 
do      
    value=""
    value=$(echo "$secretValue" | tr -d '\n' | tr -d '\r' )
    value="{\"name\":\"$secretName\",\"newValue\":\"****\"}"  #get $secretname from names.txt 
    
    echo '[]' | jq ". += [$value]" > jsonOutput.json
    
done < $input  

预期的输出应该是一个 JSON 对象数组,其中包含多个对象,但我只看到最后一个对象。由于输入文件中包含三个名称,因此输出数组中也应包含三个对象。我还想给数组一个键,输出应该如下所示:

{"secrets":[
  {
    "name": "name1",
    "newValue": "****"
  },
  {
    "name": "name2",
    "newValue": "****"
  },
  {
    "name": "name3",
    "newValue": "****"
  }
]
}

我对 jq 很陌生,我看到的各种帖子中的示例留下的问题多于它们回答的问题。请告诉我为什么数组中缺少前两个对象以及如何为数组对象分配键。

jq azure-cli
1个回答
0
投票

你的循环看起来很复杂(也许你甚至不需要它)。以下是如何在 shell 循环中使用 jq 构建一个包含计算值的 JSON 数组:

input="names.csv"
while IFS= read -r secretName || [ -n "$secretName" ];
do
    jq --arg name "$secretName" -n '{$name, newValue: "****"}'
done < "$input" | jq -s '{secrets:.}' > jsonOutput.json

这将首先创建 JSON 对象流,然后使用

-s
(
--slurp
) 选项将它们收集到单个数组中。

扩展时引用所有 shell 变量也很重要!


但是你根本不需要用shell读取文件,jq已经可以很好地读取文本文件了:

jq -R '{name: ., newValue: "****"}' "$input" | jq -s "{secrets:.}"

或者,使用单个 jq 进程:

jq -Rn '[{name: inputs, newValue: "****"}]|{secrets:.}' "$input"
© www.soinside.com 2019 - 2024. All rights reserved.