【问题标题】:How to create single slash string in terraform?如何在 terraform 中创建单斜杠字符串?
【发布时间】:2021-11-25 17:15:45
【问题描述】:

我想在 terraform 中形成一个文件系统附加命令字符串。

例如我想形成以下命令字符串

"net use Z: \\fs-0e711dfff4523c0bcbbe6a.example.com\share"

我正在尝试以下脚本

fs_attach_command = format("%s%s%s%s%s","net use Z: ", "\\",  aws_fsx_windows_file_system.fsx_windows_file_system[project.name].dns_name, "\\","share")

但是这个返回

"net use Z: \\fs-0e711dfff4523c0bcbbe6a.example.com\\share"

Terraform 版本为 v1.0.8

在 terraform 中执行此操作的正确方法是什么?

【问题讨论】:

  • 在你的第四个参数中加入一个单斜线而不是双斜线怎么样?
  • @vele 不起作用。重新调整字符串格式问题
  • 你得到什么错误?您应该编辑您的问题以显示您尝试过的替代版本以及从中得到的错误。

标签: terraform terraform-provider-aws


【解决方案1】:

Terraform 继承了类似 C 的约定,即在带引号的字符串模板中使用反斜杠作为转义字符,因此,如果您希望 final 字符串(评估后的结果)包含文字反斜杠,那么你需要通过写两个反斜杠\\来逃避它。

在您的情况下,您希望生成的字符串包含两个连续的反斜杠,因此您需要分别转义每个反斜杠,这意味着源程序中的四个连续反斜杠:\\\\

将所有这些放在一起,我们得到:

"net use Z: \\\\${aws_fsx_windows_file_system.fsx_windows_file_system[project.name].dns_name}\\share

每一对反斜杠都将成为结果字符串中的一个反斜杠,给出你想要的结果:

net use Z: \\fs-0e711dfff4523c0bcbbe6a.example.com\share

请注意,Terraform 通常在其 UI 中以引号显示字符串,就像您在源代码中编写它们一样,因此 Terraform 很可能在计划中将此值显示为 "net use Z: \\\\fs-0e711dfff4523c0bcbbe6a.example.com\\share",因此您需要在心理上评估这些转义自己排序以查看实际的字符串值。


由于这似乎是一个 Windows 批处理程序或类似的程序,因此在此字符串的末尾是否有换行符可能无关紧要,因此将其写为多行 "heredoc" string template 可能是合理的相反,这避免了反斜杠转义的需要,因为 Terraform 在此模板语法中按字面意思接受反斜杠:

fs_attach_command = <<-EOT
  net use Z: \\${aws_fsx_windows_file_system.fsx_windows_file_system[project.name].dns_name}\share
EOT

这种形式可以说更易读,因为它不包含任何转义,唯一的非文字部分是模板插值序列${ .. }。但是,因为现在这是一个多行字符串,所以它的最终值将在末尾包含一个换行符,这可能适合也可能不适合,具体取决于您最终将如何使用此字符串。 Terraform 没有用于单行字符串的“heredoc”模板语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2019-09-18
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多