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语法结构。
修复方法
- 调整if判断的Shell语法,把逻辑或拆分到两个独立的
[ ]判断之间; - 在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
相关产品推荐
相关产品推荐

