如何在YAML的until-do循环中正确包裹多行命令?
在YAML的until-do循环中编写多行Shell命令的正确方式
问题背景
我需要在YAML文件的script部分使用until-do循环,并且希望把until子句中的helm upgrade命令拆分成多行来提升可读性。
原本单独的多行helm upgrade命令写法是可行的:
- > helm upgrade $(...) /helm/charts/ -f .(...) --install --set host=(...) --set tag=(...) --set image=(...) --namespace (...)
但当我把它包裹进until-do循环后,写成下面的格式就报错了:
- > until helm upgrade $FOO helm/charts/ -f ./(...) --install --set imagePullSecret=(...) --set host=(...) --set tag=(...) --set image=(...) --namespace (...); do helm uninstall $FOO done
报错信息如下:
(...): line 161: --install: command not found (...): line 162: --set: command not found (...): line 163: --set: command not found (...): line 164: --set: command not found (...): line 165: --namespace: command not found Error: uninstall: Release not loaded: (...): release: not found
而如果把helm upgrade命令写成单行,循环就能正常运行:
- > until helm upgrade foo helm/charts/ -f ./(...) --install --set imagePullSecret=(...) --set host=(...) --set tag=(...) --set image=(...) --namespace (...); do helm uninstall foo done
运行结果正常:
Release "bar" has been upgraded. Happy Helming!
请问在YAML的until-do循环中包裹多行命令的正确方式是什么?
问题原因
报错的核心是:YAML的>折叠块会将换行符转换为空格,但当Shell命令拆分成多行时,如果没有续行符,Bash会把换行后的--install、--set等内容当成独立的新命令执行,自然就会报“命令未找到”的错误。
正确写法
要让多行命令在Shell中被识别为同一个命令的延续,需要在每行末尾添加反斜杠\,同时保持YAML的格式正确(缩进一致,>块的语法正确)。
示例如下:
- > until helm upgrade $FOO helm/charts/ -f ./(...) \ --install \ --set imagePullSecret=(...) \ --set host=(...) \ --set tag=(...) \ --set image=(...) \ --namespace (...); do helm uninstall $FOO done
关键要点
- 续行符
\:在helm upgrade命令的每一行末尾添加\,告诉Bash这一行的命令还没结束,下一行是命令的延续。注意\后面不能有多余的空格,否则会被当作命令的一部分导致报错。 - YAML缩进:保持所有命令行的缩进一致,避免因为YAML格式错误导致Shell解析异常。
until循环语法:确保until后的命令末尾有分号;,do和done的位置符合Shell语法要求。
内容的提问来源于stack exchange,提问作者wwillfred
相关产品推荐
相关产品推荐

