(1) 如果 newArray 中的所有值都作为没有空格的 JSON 值有效,那么您可以将值作为流进行管道传输,例如
newArray=(100 200 300)
echo "${newArray[@]}" |
jq -s '{client_nohup: ., server_nohup: []}'
(2)
现在假设您只想更新文件中的“nohup”对象,比如 nohup.json:
{ "client_nohup": [], "server_nohup": [ "keep me" ] }
由于您使用的是 bash,因此您可以编写:
echo "${newArray[@]}" |
jq -s --argjson nohup "$(cat nohup.json)" '
. as $newArray | $nohup | .client_nohup = $newArray
'
输出
(1)
{
"client_nohup": [
100,
200,
300
],
"server_nohup": []
}
(2)
{
"client_nohup": [
100,
200,
300
],
"server_nohup": [
"keep me"
]
}
其他情况
有志者事竟成 :-)
例如,请参阅How to format a bash array as a JSON array 上接受的答案(尽管这不是一个完全通用的解决方案)。
有关通用解决方案,请参阅 jq 常见问题解答中的 ?: How can a variable number of arguments be passed to jq? How can a bash array of values be passed in to jq as a single argument?https://github.com/stedolan/jq/wiki/FAQ
通用解决方案
需要明确的是,如果已知数组值是有效的 JSON,那么有几个不错的选择;如果数组值是任意 bash 字符串,那么使用 jq 处理它们的唯一有效、通用的方法是使用 -R jq 选项(例如与 -s 结合使用),但随后将读取 (bash) 字符串作为 JSON 字符串,因此任何预期的类型信息都将丢失。 (这里的重点在于 bash 字符串不能包含 NUL 字符的技术性。)
通常,为了减轻后一个问题,可以将数字字符串转换为 JSON 数字,例如使用 jq 成语:(tonumber? // .).