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

GitLab CI调用bash脚本报错:syntax error: bad substitution

排查./refresh.sh: line 16: syntax error: bad substitution错误

这个错误几乎都是shell兼容性问题或者bash特有的语法被非bash解释器执行导致的,结合你的场景,按以下步骤排查:

1. 检查脚本的Shebang行

首先查看refresh.sh的第一行,如果是#!/bin/sh或者未指定解释器,直接修改为#!/bin/bash。

原因:Ubuntu、Debian等系统的/bin/sh默认指向dash(POSIX兼容的轻量shell),不支持bash的扩展语法(比如数组、高级变量替换),一旦脚本使用这类语法,就会触发bad substitution错误。

2. 定位第16行的具体代码

bad substitution错误通常对应bash独有的语法,第16行大概率属于以下情况之一:

  • 数组操作:比如files=(*.yaml)或echo ${files[@]},POSIX sh不支持数组类型,可替换为for file in *.yaml; do ...; done这类循环写法。
  • 高级变量替换:比如全局替换${var//old/new}、间接变量引用${!var}、子串截取${var:2:5},这些都是bash扩展特性,POSIX sh不支持。若要兼容,需用sed等工具替代。
  • 语法拼写错误:比如少写闭合的},或变量名包含非法字符(如空格),也会触发该错误。

3. 修正GitLab CI的执行方式

在.gitlab-ci.yml中,确保脚本通过bash执行,两种实现方式:

  • 直接在script段指定bash运行:
    generate_kustomization:
      script:
        - bash refresh.sh
    
  • 为job指定bash作为默认shell:
    generate_kustomization:
      shell: bash
      script:
        - ./refresh.sh
    

本地测试验证

本地运行时,不要用sh refresh.sh,而是执行bash refresh.sh;或确保脚本有执行权限后直接运行./refresh.sh(前提是Shebang已改为#!/bin/bash)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:36:08