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