意外的运算符-Bamboo计划中的Shell脚本

问题描述

我尝试在Bamboo计划中运行shell命令。 这是我尝试运行的代码

[ "$(git rev-parse --abbrev-ref HEAD)" == *test* ] || [ "$(git rev-parse --abbrev-ref HEAD)" == *develoP* ] && echo "yes"

应检查分支名称testdevelop。如果是,那么它应该显示消息yes

我在分支develop上运行此命令,然后出现错误

错误消息: [: develop: unexpected operator


更新:

这是POSIX,因此基于帖子: String comparison in bash. [[: not found 我用单个==取代了=

所以我的命令看起来:

[ "$(git rev-parse --abbrev-ref HEAD)" = *test* ] || [ "$(git rev-parse --abbrev-ref HEAD)" = *develoP* ] && echo "yes"

我得到的错误消息: [: pytest.ini: unexpected operator

不知道pytest.ini在这里做什么。 我的应用程序使用pytest,但是在这一步中我没有运行它。

解决方法

单括号的问题是通配符会通过文件名扩展(globbing)进行扩展。考虑一下:

$ touch test{1,2,3,4}
$ set -x
$ [ "$(git rev-parse --abbrev-ref HEAD)" == *"test"* ] || [ "$(git rev-parse --abbrev-ref HEAD)" == *"develop"* ] && echo "yes"
$ [ "$(git rev-parse --abbrev-ref HEAD)" == *"test"* ]
++ git rev-parse --abbrev-ref HEAD
+ '[' develop == test1 test2 test3 test4 ']'
-bash: [: too many arguments

如果外壳中有双括号,则可以用双括号替换单括号:

[[ "$(git rev-parse --abbrev-ref HEAD)" == *"test"* ]] \
    || [[ "$(git rev-parse --abbrev-ref HEAD)" == *"develop"* ]] && echo "yes"

或者,您可以按以下方式使用case

case "$(git rev-parse --abbrev-ref HEAD)" in
    *test*|*develop*)
        echo 'yes'
        ;;
esac

请注意,单括号([)只是内置test的同义词,唯一的例外是单括号要求最后一个参数为]。>