TL;DR;你想使用一个多行 YAML 标量(为了可读性),它作为单行字符串加载,可以由 Gitlab-CI 作为命令发出。为此,请在 YAML 中使用分布在多行中的普通(不带引号)标量:
script:
- echo -e
"echo 'hi';
echo 'bye';"
请注意,YAML 对此类标量施加了一些限制。您当然需要知道的是,接下来的每一行都比echo -e 缩进至少一个位置(相对于它的集合节点缩进两个位置,根本不缩进),并且每个新行都被替换加载时按空格(因此您需要注意在哪里放置换行符)。
您的帖子中存在多种误解,导致您提出错误的问题。
没有多行 YAML 字符串这种东西。 YAML 有标量,其中一些标量可以由程序加载为字符串,而其他一些将加载为整数、浮点数等。
您显然对作为字符串加载的标量节点感兴趣,因为该字符串可以被解释为命令行。但是您不想拥有多行命令行(即嵌入换行符),因为 Gitlab CI 不支持 multi-line scripts(如 @Jordan 所示)。
为了便于阅读,您希望使用 YAML 的标准功能将多行标量加载为单行字符串。
如果您不关心可读性,您可以使用:
- echo -e "\n echo 'hi';\n echo 'bye';\n"
并且由于您的标量没有被引用(即它以 echo 开头),您不需要在 YAML 中为反斜杠或引号做任何特殊的事情。
脚本的结果是一样的(打印一个空行,在缩进四个空格的行上打印echo 'hi';,在缩进四个空格的行上打印echo 'bye';。)
如果您想使用多行输入以提高可读性,将其作为单行加载,基本上有两种选择:使用多行平面标量或在 YAML 中使用折叠标量。
多行纯标量
Plain 表示标量未加引号,与 YAML 中的任何多行内容一样,多行表示后面的行需要适当缩进,在这种情况下比初始行更远
script:
- echo -e
"echo 'hi';
echo 'bye';"
换行符被空格替换,所以不要这样做:
script:
- echo -e
"echo 'hi';
echo '
bye';"
因为您将在bye 之前获得一个可见空间。
有一些限制,例如在这样的标量中不能有冒号后跟空格(这会使它看起来像键值对)。
没有必要在纯标量中转义反斜杠,因为您无法在纯标量中转义任何字符,但当然您可以包含反斜杠,它最终会出现在从 YAML 加载的字符串中,可以 对从该字符串执行的命令有意义。
折叠标量
折叠标量类似于普通标量,在加载期间所有(单个)换行符都被空格替换:
script:
- >
echo -e
"echo 'hi';
echo 'bye';"
您需要缩进实际命令信息至少与折叠标量指示符 (>) 一样多。
与普通的标量相反,: 这样的东西没有特殊含义。因此,如果普通标量因抛出 YAML 错误而失败,则类似的折叠标量很可能不会。