【问题标题】:sh: 0: unknown operand when running shell script via dockersh: 0: 通过 docker 运行 shell 脚本时的未知操作数
【发布时间】: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

标签: bash docker


【解决方案1】:

感谢大家的回复!

所以这行得通

if [[ "$EXITCODE" == "0" && "$CI_COMMIT_BRANCH" == "staging" ]] || [[ $EXITCODE -ne 0 && "$CI_COMMIT_BRANCH" == "develop" ]]; then
  echo "Hello"
fi

我猜它不喜欢-ne。 不过我用过

if [[ $EXITCODE -ne 0 ]]; then
  echo "Hello"
fi

而且它已经独立工作了。我猜当有其他条件并且它使用==!=时你不能使用它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多