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

GitLab CI YAML配置中if条件执行报missing `]`错误如何解决

问题原因

报错和变量引号包裹没有关系,是两处语法错误共同导致的:

  • Shell的[是内置test命令的别名,解析时对格式要求极严格:[符号后、]符号前必须保留空格,且||是Shell层面的命令逻辑分隔符,不能直接写在单个[ ]结构的内部。你写的if [ "$CI_COMMIT_BRANCH" == "master" || "$EMULATE_BRANCH" == "master" ]; then会被Shell解析成两段独立内容:第一段是不完整的[ "$CI_COMMIT_BRANCH" == "master"命令,因为找不到闭合的]抛出第一个错误;第二段是被||分隔的"$EMULATE_BRANCH" == "master" ],会被当成独立命令执行,抛出command not found错误。
  • GitLab CI的script字段默认按单行数组项解析命令,你直接折行写if结构的内容,会被YAML拆成多条独立命令执行,彻底打乱Shell的if语法结构。
修复方法
  1. 调整if判断的Shell语法,把逻辑或拆分到两个独立的[ ]判断之间;
  2. 在YAML中用|标记多行脚本块,保证if结构的换行被正确识别为同一段Shell逻辑。

修复后的完整配置如下:

test:ui:with_sauce:
  ...
  script:
    - export MASTER_URL=https://masterurlexample.io
    - export TEST_PREVIEW_APP=$CI_COMMIT_REF_SLUG
    - cd $MAVEN_DIRECTORY
    - |
      if [ "$CI_COMMIT_BRANCH" = "master" ] || [ "$EMULATE_BRANCH" = "master" ]; then
        export TEST_PREVIEW_APP=$MASTER_URL
      fi
    - echo "Testing on $TEST_PREVIEW_APP"
    - echo "starting test"
    - sleep 30
    - mvn -U $MAVEN_CLI_OPTS ...
额外注意点
  • 字符串比较优先用=而非==:=是POSIX标准规定的字符串比较操作符,==是Bash的扩展语法,在部分精简Shell环境下可能执行失败。
  • 如果不想拆分两个[ ]结构,也可以在单个[ ]内用-o参数表示逻辑或,写法为if [ "$CI_COMMIT_BRANCH" = "master" -o "$EMULATE_BRANCH" = "master" ]; then,但拆分写法的可读性和跨环境兼容性更好。
  • 只要是在GitLab CI的script里写多行Shell逻辑(比如if/for/while结构、函数定义),都建议用|标记多行块,避免YAML自动折行拆碎命令结构。

内容的提问来源于stack exchange,提问作者Paul Blart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:51:18