【问题标题】:Linux bash or sed command to increment a version numberLinux bash 或 sed 命令增加版本号
【发布时间】:2021-04-12 00:49:49
【问题描述】:

我需要在脚本中添加一些东西来增加版本号:当我有字符串 1.0.2 时,我想要一个 bash 命令使它成为 1.0.3

类似这样的东西,但这不起作用:

CI_COMMIT_TAG=1.0.2
patch=$((CI_COMMIT_TAG + 1)); echo new path=${CI_COMMIT_TAG}

给出这个错误:

1.0.2: syntax error: invalid arithmetic operator (error token is ".0.2")

可能是因为1.0.2 是字符串而不是数字。

如何解决?

【问题讨论】:

  • bash 不支持浮点数。
  • 1.0.9 - 1.0.101.2.0 或其他什么之后会发生什么?有没有第二个(或第一个)数字增加的点?

标签: bash sed


【解决方案1】:

(imo) 最简单的方法是将版本号拆分为单独的(整数)组件,进行数学运算,然后将其粘贴回所需的版本字符串中。

目前有几种方法可以实现这个想法。

一个想法是使用一些基本命令来实现每个建议的步骤:

CI_COMMIT_TAG=1.0.2
IFS=. read -r v1 v2 v3 <<< "${CI_COMMIT_TAG}"    # split into (integer) components
((v3++))                                         # do the math
patch="${v1}.${v2}.${v3}"                        # paste back together

这会生成:

$ echo "${patch}"
1.0.3

通过拆分成单独的(整数)组件,如果/当您想要增加第一个/第二个组件时也会更容易。



awk 完成所有工作的另一种方法:

$ awk '
BEGIN {FS=OFS="."}                    # define input/output field delimiter as "."
      {$3++                           # increment field #3 "+1" (think "inplace" increment of field #3)
       print                          # print current line
      }
' <<< "${CI_COMMIT_TAG}"
1.0.3

# removing comments, collapsing to a one-liner, and storing the result in variable 'patch'

$ patch=$(awk 'BEGIN {FS=OFS="."} {$3++; print}' <<< "${CI_COMMIT_TAG}")
$ echo $patch
1.0.3


注意:这两个解决方案都假设第三个组件是整数,否则添加“+1”(v3++/$3++)的步骤将失败;可以添加额外的编码来验证第三个组件实际上是一个整数。

【讨论】:

  • 如果可以的话+2;非常准确和有启发性的答案
  • awk 命令中,将$3++ 替换为if ($NF ~ /^[0-9]+$/) $NF++ 以处理3 个以外的组件,并跳过非数字。
  • 非常适合我的第一个解决方案。谢谢markp-fuso
  • 我还研究了第二个 awk 解决方案和 Gordon 建议的更通用的解决方案,也许那更好。谢谢戈登。
  • 请注意,您可以这样做:patch="${v1}.${v2}.$((++v3))",尽管这只是一种风格选择,避免使用这样的代码并非不合理。
【解决方案2】:

另一种方法是使用 bash 数组与 @markp-fuso 中的相同注释

CI_COMMIT_TAG=1.0.2
patch=(${CI_COMMIT_TAG//./ })
patch[2]="$((${patch[2]}+1))"
patch="${patch[*]}"
patch="${patch// /.}"
echo "$patch"

【讨论】:

    【解决方案3】:
    $ CI_COMMIT_TAG=1.0.2
    $ readarray -td'.' f <<<"$CI_COMMIT_TAG"
    $ echo "${f[0]}.${f[1]}.$((f[2]+1))"
    1.0.3
    

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2011-04-28
      • 2013-12-07
      相关资源
      最近更新 更多