【发布时间】:2022-01-07 06:42:32
【问题描述】:
我在 yaml 文件中有此代码。这个文件在我运行 docker 时运行。
if [[ $EXITCODE -ne 0 && "$CI_COMMIT_BRANCH" == "staging" ]] || [[ $EXITCODE -ne 0 && "$CI_COMMIT_BRANCH" == "develop" ]]; then
echo "Hello"
fi
当我在终端中运行这些代码行时,它可以正常工作。 但是当我通过 docker 运行这个文件时,我得到了这个错误
sh: 0: unknown operand
这里发生了什么?为什么我会收到此错误?我尝试对 $EXITCODE 和 0 使用不同的语法,但仍然遇到相同的错误
【问题讨论】:
-
是否定义了
$EXITCODE?引用它。 -
是的,当我运行
echo $EXITCODE时,它给了我一个值 -
您在终端中还是通过 docker 运行了 echo?那个 yaml 在哪里,是什么解析它,compose,一个 CI 工具?
-
在您的 docker 容器中,运行 sh --version 并让我们知道它是否自称为 GNU bash,以及版本号。如果您的 docker 容器的操作系统不只是将 bash 别名为 sh,那么用于测试的双方括号和用于相等的双等号之类的 Bashism 将不起作用,因为它们不符合 POSIX 标准。请参阅this link 了解常见的 bashism 以及如何转换为 POSIX
-
如果你有
bash,我会避免在[[ ... ]]中使用-eq和-ne,除非是为了提高可读性。if (( $EXITCODE != 0)) && [[ "$CI_COMMIT_BRANCH" == "staging" ]],例如。但是在bash中,-ne和-eq都触发算术评估,这意味着即使EXITCODE没有定义,那么$EXITCODE生成的空字符串将被视为隐式0。