Bamboo计划中Shell脚本执行报错:Unexpected operator求助
解决Bamboo中Shell分支检测的错误问题
你遇到的两个错误本质上都是因为POSIX标准shell(比如Bamboo默认的sh)和bash的语法差异,以及通配符处理的问题,下面一步步拆解并给出正确的解决方法:
第一个错误:[: develop: unexpected operator
初始命令里的==是bash的扩展语法,POSIX标准的test/[命令只支持=来做字符串比较,所以你换成=是对的,但这只是解决了一部分问题。
第二个错误:[: pytest.ini: unexpected operator
这个错误的根源是:你用了*test*这种通配符写法,但在POSIX [命令中,=是精确字符串匹配,不支持通配模式。更糟的是,shell会先对*test*做文件名扩展(glob)——如果当前工作目录下有匹配这个模式的文件(比如你提到的pytest.ini),*test*会被替换成这些文件名的列表,导致[命令收到错误数量的参数,从而抛出"unexpected operator"的错误。
正确的POSIX兼容写法
要在POSIX shell中安全地实现“分支名包含test或等于develop”的检测,推荐用case语句(它原生支持模式匹配,且不会被文件名扩展干扰):
branch=$(git rev-parse --abbrev-ref HEAD) case "$branch" in *test*|develop) echo "yes" ;; esac
或者如果想写成一行:
case $(git rev-parse --abbrev-ref HEAD) in *test*|develop) echo "yes" ;; esac
为什么这个写法有效?
case语句的模式匹配是原生支持的,*test*会被当作通配模式,而不是被shell展开成文件名。- 完全符合POSIX标准,在Bamboo的默认shell环境下可以稳定运行。
另外,如果你确实想使用[命令配合文本匹配,也可以用grep来规避glob问题:
git rev-parse --abbrev-ref HEAD | grep -E 'test|^develop$' >/dev/null && echo "yes"
这里-E启用扩展正则,^develop$确保精确匹配develop分支,test则匹配任意包含test的分支名,>/dev/null是为了屏蔽grep的输出,只通过退出码判断是否匹配。
内容的提问来源于stack exchange,提问作者CezarySzulc
相关产品推荐
相关产品推荐

