You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 # 验证写入结果

你之前报错的原因

  1. unexpected end of file:

    • 核心是heredoc的结束标记EOF被缩进了。bash要求<<EOF对应的结束标记必须顶格写,不能有任何空格或缩进,否则bash会认为heredoc还没结束,直到脚本末尾就触发这个错误。
    • 另外如果没在GitLab CI的script里用- |包裹整个多行脚本,yaml会把case的每一行拆成单独的bash命令执行,导致case语法断裂,也会触发这个错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:00:06