Linuxbash或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}
CI_COMMIT_TAG=1.0.2
patch=$((CI_COMMIT_TAG + 1)); echo new path=${CI_COMMIT_TAG}
给出这个错误:
可能是因为1.0.2是字符串而不是数字。
如何解决这个问题?
回答
(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++)的步骤将失败;可以添加额外的编码来验证第三个组件实际上是一个整数。
- In the `awk` command, replace `$3++` with `if ($NF ~ /^[0-9]+$/) $NF++` to cope with other than 3 components, and skip non-numerics.