如何在同一个字符串中转义YAML中的双引号和单引号

use*_*519 17 yaml escaping ansible ansible-playbook

我需要在ansible playbook中正确地转义单引号和双引号以设置环境变量.这些都不起作用:

  - name: Set environment variable
    command: >
      export EXTRA_CONFIG=“'”{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}“'”

  - name: Set environment variable
    command: >
      export EXTRA_CONFIG=''{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}''

  - name: Set environment variable
    command: >
      export EXTRA_CONFIG=''{\"client\": {\"subscriptions\": [\"DIND-Worker\"], \"cluster\": \"internal\"}}''
Run Code Online (Sandbox Code Playgroud)

看着这个:

http://yaml.org/spec/current.html#id2532720

https://github.com/dotmaster/toYaml/issues/1

我得到的错误信息是:

fatal: [ip.address]: FAILED! => {"changed": false, "cmd": "export 'EXTRA_CONFIG={\"client\":' '{\"subscriptions\":' '[\"DIND-Worker\"],' '\"cluster\":' '\"internal\"}}'", "failed": true, "msg": "[Errno 2] No such file or directory", "rc": 2}
Run Code Online (Sandbox Code Playgroud)

fly*_*lyx 20

>启动一个块标量,你根本不需要转义任何东西(并且没有处理转义序列).因此,假设您需要围绕类似JSON的值的单引号,只需执行以下操作:

  - name: Set environment variable
    command: >
      export EXTRA_CONFIG='{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}'
Run Code Online (Sandbox Code Playgroud)

编辑:还要注意,默认情况下折叠标量包含尾随换行符.如果你不想拥有它,只需使用>-而不是>.

  • 我根据我对YAML的了解回答了这个问题.我不知道ansible.但我猜这个命令是在一个独立的shell实例中执行的,所以在这里导出任何东西都不会影响系统.如果要设置全局环境变量,则必须将其放在`/ etc/environment`或其他内容中. (2认同)

Ant*_*hon 5

您正在使用折叠样式标量(由引入>),并且根据YAML 1.2规范,您不能转义字符:

折叠标量:

折叠样式由“>”指示符表示。它类似于文字风格。但是,折叠标量会折线。

并且相关文本以文字样式标量转义。

在文字标量中,所有(缩进的)字符都被视为内容,包括空格字符。请注意,所有换行符均已标准化。此外,空行不会折叠,尽管最后的行中断和尾随的空行会被切掉。

从您的示例尚不清楚您真正想要做什么。您可能应该放弃折叠样式而改用双引号样式:

用双引号引起来的样式由周围的“””指示符指定。这是唯一能够使用“ \”转义序列来表示任意字符串的样式。这是以必须转义“ \”和“””为代价的字符。

或单引号样式:

单引号样式由周围的“'”指示符指定。因此,在单引号中,这些字符需要重复。这是在单引号标量中执行转义的唯一形式。特别是,可以自由使用“ \”和“”字符,这将单引号标量限制为可打印字符。此外,仅可以折断长单引号行,其中空格字符被非-空间。

因此,您应该首先确定输出应该是什么,然后如果需要使用反斜杠转义任何字符。如果您不这样做,则可以不使用任何转义就使用折叠样式,或者通过转义来使用单引号样式',或者通过转义"和any来使用双引号样式\。如果需要\转义双引号样式是唯一的选择。