join
可以,但是我想保留双引号,所以给我
[ben,linda,john]
但是我想要这个
["ben", "linda", "john"]
这太疯狂了,花了两个多小时试图解决 我想将列表作为字符串变量传递 为什么terraform不能只将我的列表作为字符串?为什么这么难?
所以我有
name = ["ben", "linda", "john"]
并且我想将其传递给terrform中使用的变量
var.name
为什么畸形者不能照原样采取这种方式?
我收到一条错误消息,说该字符串是epxtected,到处都存储之后我找不到在线解决方案
我已经能够获得
[ ben,linda,john ]
使用join(",", var.name)
,但我想要["ben", "linda", "john"]
$ terraform --version
Terraform v0.12.18
+ provider.aws v2.42.0
+ provider.template v2.1.2
答案 0 :(得分:1)
从列表到字符串的转换始终需要明确决定结果的格式:哪个字符(如果有)将分隔单个项目,哪个定界符(如果有)将标记每个项目,哪些标记将包含在将结果明确标记为列表的开始和结束(如果有的话)。
您显示的语法示例看起来像JSON。如果这是您的目标,那么最简单的答案是使用jsonencode
将列表直接转换为JSON语法:
jsonencode(var.names)
此函数生成紧凑的JSON,因此结果如下:
["ben","linda","john"]
Terraform提供了JSON的即用型功能,因为它是常见的需求。如果您需要对上述决策进行更多控制,则需要使用更复杂的技术来向Terraform描述您所需的内容。例如,要生成一个字符串,其中每个输入字符串都用引号引起来,则各项之间用逗号分隔,并用[
和]
标记来分隔整个结果,分三个步骤:
[for s in var.names : format("%q", s)]
,
作为分隔符来加入结果:join(", ", [for s in var.names : format("%q", s)])
"[ ${join(",", [for s in var.names : format("%q", s)])} ]"
上面的决定与列表的JSON编码相同,因此没有真正的理由去做上面显示的事情,但是我在这里展示了各个步骤作为示例,以便那些想要产生不同的列表序列化有一个起点。
例如,如果逗号后的空格很重要,则可以将上面的第一个参数join
调整为包含空格:
"[ ${join(", ", [for s in var.names : format("%q", s)])} ]"
答案 1 :(得分:0)
我想改进 jsonencode
的建议。相反,我使用 join
函数。
当列表有元素时...
> join("", ["join", "these", "strings"])
"jointhesestrings"
也适用于空列表...
> join("", [])
""