momo's Blog.

震惊,写了快2年的yaml竟然第一次知道还能这样转义

字数统计: 364阅读时长: 1 min
2021/12/17 Share

前言

一般来说,我们在写yaml文件的时候,遇到单行需要转移的特殊字符,比如: ' * 总之奇奇怪怪的转移需求。比如以下例子:

1
2
scripts:
- 'echo {''"''userName''"'': ''"''${GITLAB_USER_NAME}''"'', ''"''jobName''"'': ''"''${XXX_textinput}''"'', ''"''CI_PIPELINE_CREATED_AT''"'': ''"''${CI_PIPELINE_CREATED_AT}''"'', ''"''CI_JOB_STATUS''"'': ''"''${CI_JOB_STATUS}''"'', ''"''CI_JOB_URL''"'': ''"''${CI_JOB_URL}''"''} > tmp.json'

这转义双引号把我给整麻了。

解决

实际上,我们都知道| && |- && |+ 这几个功能的用法。

介绍语法的时候,告诉你这个是保留换行符,并且+ - 分别是保留末尾换行符,还是说删除末尾换行符。

其实我们(也许只有我自己)都没有意识到,它既然保留了换行符,那说明什么,说明他把换行符给转义成普通文本了。那我们是不是可以根据这个特性直接去使用, 而不是我们自己通过单引号去转义字符???

这样是不是看着顺眼许多了,我们不需要关注yaml里面的转义,只需要关注shell中的转义即可。

1
2
3
scripts:
- |-
echo {'"'userName'"': '"'${GITLAB_USER_NAME}'"', '"'jobName'"': '"'${XXX_textinput}'"', '"'CI_PIPELINE_CREATED_AT'"': ''"''${CI_PIPELINE_CREATED_AT}'"', '"'CI_JOB_STATUS'"': '"'${CI_JOB_STATUS}'"', '"'CI_JOB_URL'"': '"'${CI_JOB_URL}'"'} > tmp.json

顺便多一嘴,如果是json拼接多话,用jq命令可能会比较好,缺点是有可能没有这个命令

1
2
- |- 
echo '"'${GITLAB_USER_NAME},${XXX_textinput},${CI_PIPELINE_CREATED_AT},${CI_JOB_STATUS},${CI_JOB_URL}'"' | ./jq 'split(",")' | ./jq "{userName: .[0], jobName: .[1], CI_PIPELINE_CREATED_AT: .[2], CI_JOB_STATUS: .[3], CI_JOB_URL: .[4]}"
CATALOG
  1. 1. 前言
  2. 2. 解决