给定一个 YAML 文件example.yaml
:
services:
api:
image: myImage
ports:
- 8080:8080
environment:
- "TEST_STRING_WITH_SPACE=?"
TEST_STRING_WITH_SPACE
我需要用多个单词的字符串参数替换环境变量值。预期是这样的:
services:
api:
image: myImage
ports:
- 8080:8080
environment:
- "TEST_STRING_WITH_SPACE=With Space"
我正在使用的yq
工具,版本:
yq (https://github.com/mikefarah/yq/) version v4.44.5
当我尝试用没有空格的字符串设置值时,它有效:
yq '.services.api.environment[0] = "TEST_STRING_WITH_SPACE='$(echo "WithoutSpace")'"' example.yaml
但是,当我尝试使用带空格的字符串设置值时,它不起作用:
yq '.services.api.environment[0] = "TEST_STRING_WITH_SPACE='$(echo "With Space")'"' example.yaml
收到错误:
错误:1:32:无效输入文本“TEST_STRING_WIT...”
怎么解决?
您需要使用
strenv()
函数来实现这一点。它在读取和更新作业中的特殊字符时很有用,否则无法直接设置。生产,
这与Inian 的解决方案类似,但表达式中未提及变量
yq
。相反,它会尝试用数组第一个元素中同名的现有环境变量替换该值environment
。该
sub
命令首先截断数组元素的值=
,然后用形式为的赋值替换它var=${var}
,envsubst
然后对其进行操作。如果未设置环境变量,则所使用的参数
envsubst
可确保命令正常失败。使用问题中给出的 YAML 文件进行测试:
测试失败(未设置环境变量):
通过将操作应用于整个数组,我们可以替换多个值: