问题描述
我尝试在Bamboo计划中运行shell命令。 这是我尝试运行的代码:
[ "$(git rev-parse --abbrev-ref HEAD)" == *test* ] || [ "$(git rev-parse --abbrev-ref HEAD)" == *develoP* ] && echo "yes"
应检查分支名称为test
或develop
。如果是,那么它应该显示消息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
的同义词,唯一的例外是单括号要求最后一个参数为]
。>