Git Actions工作流中Bash脚本执行结果不符合预期问题
问题根因
- 该问题是GitHub Actions工作流
run步骤的默认执行shell和本地测试环境不一致导致的:[[ ]]是Bash独有的扩展语法,不属于POSIX shell标准,不被dash、原生sh等轻量shell支持- GitHub Actions的runner不会默认强制使用Bash执行
run脚本:Linux环境下部分镜像默认将sh指向不支持Bash语法的dash,Windows环境默认shell是PowerShell,这两种场景都会无法识别[[ ]]语法,直接导致整个if判断块执行报错,then分支内的变量赋值逻辑完全不会运行,因此变量始终保留初始值myear
- 本地在线编译器默认使用Bash执行代码,所以逻辑能正常跑通。查看工作流执行日志,能在if语句对应行找到类似
[[: not found的报错,第二个echo $?打印的退出码为非0值,刚好对应if块执行失败的状态。
修复方案
两种方案选其一即可:
- 方案1:显式指定
run步骤使用Bash执行,从根源上避免shell差异问题,这是GitHub Actions里写shell脚本最稳妥的实践
对应工作流配置示例:- name: 更新EAR文件名 shell: bash run: | UPDATED_EARFILE_NAME=myear echo $? if [[ "envName" == "envName" ]] then UPDATED_EARFILE_NAME=updatedName.ear fi echo $? echo ear name : $UPDATED_EARFILE_NAME - 方案2:将条件判断改写为POSIX标准兼容的语法,不依赖Bash扩展特性,所有标准shell都可以正常执行
改写后的脚本代码:
注意:POSIX标准的单中括号判断中,字符串比较请使用单等号UPDATED_EARFILE_NAME=myear echo $? if [ "envName" = "envName" ] then UPDATED_EARFILE_NAME=updatedName.ear fi echo $? echo ear name : $UPDATED_EARFILE_NAME=,双等号==属于Bash扩展写法,在部分POSIX shell下会触发语法错误。
内容的提问来源于stack exchange,提问作者Anurag1804
相关产品推荐
相关产品推荐

