GitLab CI嵌套多行字符串报'unexpected end of file'错误求解
GitLab CI中Case语句内使用Heredoc的正确写法
先上能正常运行的示例代码,对应你的需求:
stages: - deploy deploy_job: stage: deploy script: - | # 先确保APP_NAME变量已正确设置 echo "当前分支对应的APP_NAME: $APP_NAME" case "$APP_NAME" in "develop") # 写入需要展开变量的内容,EOF不引起来 cat <<EOF >> app_config.yaml app_name: $APP_NAME env: development log_level: debug EOF ;; "main") # 写入不展开变量的内容,EOF用单引号括起来 cat <<'EOF' >> app_config.yaml app_name: $APP_NAME env: production log_level: info EOF ;; *) echo "不支持的分支对应APP_NAME: $APP_NAME" exit 1 ;; esac - cat app_config.yaml # 验证写入结果
你之前报错的原因
unexpected end of file:
- 核心是heredoc的结束标记
EOF被缩进了。bash要求<<EOF对应的结束标记必须顶格写,不能有任何空格或缩进,否则bash会认为heredoc还没结束,直到脚本末尾就触发这个错误。 - 另外如果没在GitLab CI的script里用
- |包裹整个多行脚本,yaml会把case的每一行拆成单独的bash命令执行,导致case语法断裂,也会触发这个错误。
- 核心是heredoc的结束标记
syntax error near unexpected token '|':
- 大概率是你把
|加在了case分支内部的行前,或者yaml缩进错误,导致|被bash当成了命令符号解析,而不是yaml的多行标记。
- 大概率是你把
关键注意事项
- 必须用
- |包裹整个bash脚本块:让yaml把所有行当作一个完整的bash命令执行,避免换行被拆分。 - heredoc结束标记
EOF必须顶格:不管yaml的缩进是多少,EOF这一行不能有任何缩进。 - 控制变量展开:如果要让heredoc里的变量被bash替换,就用
<<EOF;如果要保留变量原字符串,就用<<'EOF'(单引号括住EOF)。 - 保证case语法完整:每个分支末尾加
;;,整个case语句最后要加esac收尾。
内容的提问来源于stack exchange,提问作者nixmind
相关产品推荐
相关产品推荐

