我要使用jq从环境变量更新JSON文件中的integer
,但是该属性被解析为字符串。
例如,我想更新task_definition.json
中的memory属性。该属性必须是整数,否则API会引发错误。
{
"containerDefinitions": [
{
"cpu": 128,
"image": "...",
"memory": 512
...
}
]
}
export TASK_DEFINITION_MEMORY=256
jq '.containerDefinitions[0].memory = env.TASK_DEFINITION_MEMORY' task_definition.json > tmp.$$.json && mv tmp.$$.json task_definition.json
{
"containerDefinitions": [
{
"cpu": 128,
"image": "...",
"memory": 256
...
}
]
}
{
"containerDefinitions": [
{
"cpu": 128,
"image": "...",
"memory": "256"
...
}
]
}
答案 0 :(得分:2)
尝试使用算术更新分配运算符//=
https://stedolan.github.io/jq/manual/#Assignment
算术更新分配:+ =,-=,* =,/ =,%=,// = jq有一些形式为op = b的运算符,它们都等于| =。 op b。 因此,+ = 1可用于增加值,与| =相同。 + 1。
export TASK_DEFINITION_MEMORY=256
jq '.containerDefinitions[0].memory //= env.TASK_DEFINITION_MEMORY' task_definition.json > tmp.$$.json && mv tmp.$$.json task_definition.json
答案 1 :(得分:1)
这里需要调用tonumber
,以将字符串转换为数字。 //=
在这里有点鲱鱼。
另一种选择是使用—-argjson
将数字传递给jq。
答案 2 :(得分:0)
这是使用基于unix步行路径的实用程序 jtc
来完成相同询问的另一种方法。
如果JSON中的memory
标签/记录唯一地标识了更新的位置,则:
bash $ TASK_DEFINITION_MEMORY=256
bash $ jtc -w'<memory>l' -u"$TASK_DEFINITION_MEMORY" task_definition.json
{
"containerDefinitions": [
{
"cpu": 128,
"image": "...",
"memory": 256
}
]
}
bash $
如果您想直接将其更新到源文件中(而不是打印),则在文件名之前插入选项-f
PS>披露:我是jtc
-用于JSON操作的shell cli工具的创建者