Linux bash 或 sed 命令增加版本号

Ben*_*Ben 1 bash sed

我需要在脚本中添加一些东西来增加版本号:当我有 string 时1.0.2,我想要一个 bash 命令来让它1.0.3.

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

CI_COMMIT_TAG=1.0.2
patch=$((CI_COMMIT_TAG + 1)); echo new path=${CI_COMMIT_TAG}
Run Code Online (Sandbox Code Playgroud)

给出这个错误:

CI_COMMIT_TAG=1.0.2
patch=$((CI_COMMIT_TAG + 1)); echo new path=${CI_COMMIT_TAG}
Run Code Online (Sandbox Code Playgroud)

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

如何解决这个问题?

mar*_*rkp 6

(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
Run Code Online (Sandbox Code Playgroud)

这会产生:

$ echo "${patch}"
1.0.3
Run Code Online (Sandbox Code Playgroud)

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



另一种让我们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
Run Code Online (Sandbox Code Playgroud)

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

  • 在 `awk` 命令中,将 `$3++` 替换为 `if ($NF ~ /^[0-9]+$/) $NF++` 以应对 3 个组件以外的情况,并跳过非数字。 (2认同)