jq:通过shell变量追加JSON对象
简单的数据
__func() {
_storage_size="100"
_storage_used="200"
_storage_avail="300"
echo '{}' | jq \
'.storage_size +="'$_storage_size'"' | jq \
'.storage_used +="'$_storage_used'"' | jq \
'.storage_avail +="'$_storage_avail'"' | jq
}
__func
{
"storage_size": "100",
"storage_used": "200",
"storage_avail": "300"
}
复杂数据场景
场景1
#!/usr/bin/env bash
__main() {
_Json=$(
_time1=$(date '+%s')
_time2=$(date -d @"$_time1" +'%Y-%m-%d %T')
echo "{}" |
jq --arg v "$_time1" '.time[0]=$v' |
jq --arg v "$_time2" '.time[1]=$v' |
jq --arg v "200" '.code=$v' |
jq --argjson v "[1,2,3]" '.data=$v' |
jq -c
)
echo "$_Json"
}
__main
{"time":["1667648450","2022-11-05 19:40:50"],"code":"200","data":[1,2,3]}
场景2
__func() {
_obj_name="obj_name"
_obj_json='{ "test": "json" }'
echo '{ "data": {} }' | jq \
--arg objectName "$_obj_name" \
--argjson jsonString "$_obj_json" \
'.data[$objectName] += $jsonString'
}
__func
{
"data": {
"obj_name": {
"test": "json"
}
}
}
split
使用 split 将字符串转换为数组
echo '"aa bb cc"' | jq 'split(" ")'
[
"aa",
"bb",
"cc"
]
简单理解, 这里把 jq 理解为一款变成语言
第 2 3 行 定义 Shell 环境变量
第 5 6 行定义 jq 预处理变量 --arg
和 --argjson
相当于 jq 的变量类型
第 7 行, 也就是 jq 的代码了, 内部的 $jsonString
数据 jq 变量, 而不是 Shell 环境变量
http://ask.sov5.cn/q/ZjtdvZgsJ9
相关连接
如何删除jq输出中用于解析bash中的json文件的双引号? http://cn.voidcc.com/question/p-dqzfaxft-uw.html
jq&bash:从变量中生成JSON数组 https://oomake.com/question/6505361
https://stedolan.github.io/jq