给定下面的json:
./versions.json
{
"my-app-1": "v1.0.0",
"my-app-2": "v0.9.1",
"my-app-3": "v2.1.7"
}
我想将$APP_NAME
的版本替换为新版本$NEW_VERSION
。鉴于APP_NAME=my-app-2
和NEW_VERSION=v1.0.0
,我尝试了以下方法:
jq '(."$APP_NAME") = "$NEW_VERSION"' ./versions.json > updated_versions.json
这给了:
./updated_versions.json
{
"my-app-1": "v1.0.0",
"my-app-2": "v0.9.1",
"my-app-3": "v2.1.7",
"$APP_NAME": "$NEW_VERSION"
}
这:
jq "(.$APP_NAME) = "$NEW_VERSION"" versions.json > updated_versions.json
给:
jq: error: app/0 is not defined at <top-level>, line 1:
(.my-app-1) = "v1.0.0"
jq: 1 compile error
如何转义环境变量中的特殊字符?我试过设置APP_NAME=my\-app\-1
但没有运气。
谢谢
使用其--arg
选项将两个变量传递给jq
:
jq --arg appName my-app-2 --arg newVersion v1.0.0 '.[$appName]=$newVersion'
在第一次尝试中,jq
命令用单引号括起来,因此留给jq
来解决变量,但它不会在外壳上下文中查找它们。
您的第二次尝试几乎很好(但不是很好的做法(,因为变量是由 shell 扩展的,但my-app-1
包含特殊字符(破折号(,需要使用."my-app-1"
或.["my-app-1"]
进行访问。