【发布时间】:2021-06-13 15:02:25
【问题描述】:
我有下面的 JSON,我需要修改一些元素值,并且只提取 containerDefinitions 中的内容,同时保留方括号。
以下脚本用于替换所需的值并在 containerDefinitions 内的方括号内提取 json,但省略了方括号。是否有可以保留方括号的附加命令。
echo $TASK_DEFINITION | jq '.taskDefinition.containerDefinitions[0] | ( .environment[] |= if .name == "SMT_PORT_3306_TCP_ADDR" then .value = "myvalue" elif .name == "SERVER_API_TIMEOUT_SUBSCRIPTIONS_CANCEL_REQUEST" then .value = "myvalue" else . end) | .logConfiguration.options."awslogs-group" = "myvalue" ' > ${TASK_DEFINITION_PATH}/${SERVICE_NAME}2-task-definition.json
输入 JSON
{
"taskDefinition":{
"taskDefinitionArn":"some value",
"containerDefinitions":[
{
"name":"common-api-img",
"environment":[
{
"name":"SERVER_API_TIMEOUT_SUBSCRIPTIONS_CANCEL_REQUEST",
"value":"false"
},
{
"name":"SMT_PORT_3306_TCP_ADDR",
"value":"valueToReplace"
}
],
"mountPoints":[
],
"volumesFrom":[
]
}
],
"revision":65,
"volumes":[
],
"status":"ACTIVE"
}
}
预期输出
[
{
"name":"common-api-img",
"environment":[
{
"name":"SERVER_API_TIMEOUT_SUBSCRIPTIONS_CANCEL_REQUEST",
"value":"myvalue"
},
{
"name":"SMT_PORT_3306_TCP_ADDR",
"value":"myvalue"
}
],
"mountPoints":[
],
"volumesFrom":[
]
}
]
【问题讨论】:
-
包含您的实际输出会很有帮助,而不仅仅是预期输出,因此只需阅读问题即可比较它们。
-
顺便说一句,如果
echo $TASK_DEFINITION没有更改为echo "$TASK_DEFINITION"带引号,你会得到I just assigned a variable, butecho $variableshows something else!中描述的错误 -
(您可能还希望避免为自己的变量使用全大写名称——这些名称由 POSIX 定义,用于对 shell 和 OS 本身有意义的变量,而保证符合 POSIX 的工具不要通过更新名称中至少包含一个小写字符的变量来修改其行为;请阅读pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,记住修改常规 shell 变量会覆盖任何具有相同名称的环境变量。
-
(以上就是为什么在 bash 中写
for path in ...是安全的,但写for PATH in ...是安全的——只有全大写变量对 shell 行为有副作用)。