在 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 很陌生,我看到的各种帖子中的示例留下的问题多于它们回答的问题。请告诉我为什么数组中缺少前两个对象以及如何为数组对象分配键。
你的循环看起来很复杂(也许你甚至不需要它)。以下是如何在 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"