【问题标题】:GitLab CI: Bash if Statement in Job wrong resultGitLab CI:如果作业中的语句错误结果,则 Bash
【发布时间】:2021-08-24 03:58:51
【问题描述】:

我有一个带有 bash if 语句的 GitLab 工作,看起来像这样

script:
  - echo $NEW_VERSION
  - export STAGE=staging
  - |-
    if [[ $(expr match "$NEW_VERSION", '([0-9]+)\.([0-9]+)\.([0-9]+)$') != 0 ]]; then 
      export STAGE=production; 
    fi
  - echo $STAGE

变量$NEW_VERSION 来自上一步。此变量的内容是语义版本字符串,如1.0.01.0.1-develop.1。如果此变量是预发布版本(它包含开发后缀),我想将$STAGE 设置为暂存,否则设置为production

我的问题是,无论$NEW_VERSION 变量有哪些内容,$STAGE 总是设置为暂存。

如果我在本地 Mac 上执行脚本,则值设置正确。

这里是日志输出:

$ echo $NEW_VERSION
11.0.0
$ export STAGE=staging
$ if [[ $(expr match "$NEW_VERSION", '([0-9]+)\.([0-9]+)\.([0-9]+)$') != 0 ]]; then  # collapsed multi-line command
staging

有没有人遇到过类似的问题或知道为什么这个解决方案不起作用?

【问题讨论】:

  • 如果您只需要匹配字符串develop,您可以使用[[ "${NEW_VERSION}" == *develop* ]][[ "${NEW_VERSION}" =~ develop ]]吗?
  • 是的,这也是我的第一种方法,但是 bash 不存在 =~ 运算符。阅读此处了解更多信息:stackoverflow.com/a/63124383/10115037
  • bash --version 返回什么?
  • 奇怪。它说eval: line 120: bash: not found
  • @Markus 听起来您实际上并没有在 bash 下运行,甚至没有可用的 bash。 bash 确实有=~,它是added in version 3.0-alpha)。您链接的关于=~ 的答案实际上不是关于 bash,而是关于 ash 的 BusyBox 版本(显然是作为 bash 传递的?)

标签: bash gitlab gitlab-ci


【解决方案1】:

使用grep更简单。

if printf "%s\n" "$NEW_VERSION" | grep -xq '[0-9]\+\.[0-9]\+\.[0-9]\+'; then

【讨论】:

    【解决方案2】:

    这似乎是由于正则表达式中的语法错误和"$NEW_VERSION" 后面的多余逗号(附加到变量的值)造成的。此版本按预期工作。

    echo $NEW_VERSION
    export STAGE=staging
    if [ "$(expr match "$NEW_VERSION" '^[0-9]\+\.[0-9]\+\.[0-9]\+$')" != 0 ]; then
        export STAGE=production
    fi
    echo $STAGE
    

    【讨论】:

      【解决方案3】:

      我更喜欢带有 =~ 运算符的纯 bash 版本。 如果不工作,请验证您是否真的在使用 bash。

      echo $NEW_VERSION
      export STAGE=staging
      if [[ "${NEW_VERSION}" =~ ([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
          export STAGE=production
      fi
      echo $STAGE
      

      备注:

      • =~ 运算符中使用双括号
      • 不要将正则表达式放在引号中

      奖金:

      • =~ 是内部运算符,因此它比 expr 调用更快

      (使用 GNU bash 测试,版本 5.0.17)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-28
        • 2021-01-20
        • 1970-01-01
        • 2021-06-07
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多