正在检查Jenkins shell脚本中是否存在分支



我在检查Jenkins作业中是否存在分支时遇到问题。我的shell脚本如下:

set +e
BRANCH_EXISTS=$(git ls-remote --quiet | grep -w ${BRANCH_NAME})
if [[ -z $"{BRANCH_EXISTS}" ]]
then
echo "Branch does not exist"
else 
echo "Branch exists"
fi

以下是日志:

07:36:26 + BRANCH_EXISTS='4cbe2d1776db4dc263a1e7884e35da49a0a6f309  refs/heads/equalizer_fe_testing'
07:36:26 + [[ -z {BRANCH_EXISTS} ]]
07:36:26 + echo 'Branch exists'
07:36:26 Branch exists
...
07:36:27 + BRANCH_NAME=test/fe-testing_staging1
07:36:27 ++ grep -w test/fe-testing_staging1
07:36:27 ++ git ls-remote --quiet
07:36:28 + BRANCH_EXISTS=
07:36:28 + [[ -z {BRANCH_EXISTS} ]]
07:36:28 + echo 'Branch exists'
07:36:28 Branch exists
07:36:29 Finished: SUCCESS

正如您所看到的,在一个案例中,我检查了一个不存在的分支。但如果条件仍然成立。我也尝试过if [[ -n $"{BRANCH_EXISTS}" ]],但仍然得到了相同的结果。

我在这里做错了什么?

您错误地使用测试运算符来检查字符串是否为空。在大多数外壳中,变量插值发生在${var}而不是{var}$"{var}"

$ var=foo
$ [[ -z $var ]] && echo ok
$ [[ -z $var ]] || echo ok
ok
$ var=
$ [[ -z $var ]] && echo ok
ok
$ [[ -z var ]] && echo ok     # does not assert, because literal 'var' is not empty

当您执行[[ -z {var} ]]时,不是对var进行插值,而是与从不为空的文字字符串{var}进行比较。

将条件更改为[[ -z "${BRANCH_EXISTS}" ]],使其按预期工作。

正如Inian在他的回答中已经解释的那样,$"{BRANCH_EXISTS}",但"${BRANCH_EXISTS}"是正确的。然而,它还有更多:

在您的情况下,双引号是不必要的,因为在参数扩展后,这里不会发生分词(因为您在[[....]]中。因此,您可以简单地编写[[ -z $BRANCH_EXISTS ]]

但是,如果分支不存在,grep将返回一个非零退出代码,并且程序将中止(由于您的set -e。因此,即使您修复了条件,条件的then分支也永远不会执行。

最新更新