修复Shell脚本以增加semversion

我从不使用shell(bash),但是在脚本中发现了一些我用来增加版本的bug。脚本可以正常工作,直到这种情况为止

version=1.27.9
echo $version | awk -F. -v OFS=. 'NF==1{print ++$NF}; NF>1{if(length($NF+1)>length($NF))$(NF-1)++; $NF=sprintf("%0*d",length($NF),($NF+1)%(10^length($NF))); print}'

1.28.0  <-- result,but I need 1.27.10

在这种情况下,new_version等于1.28.0。如何更改此脚本以避免增加MINOR号?对于这种情况,我期望1.27.10

我没有shell经验,所以不知道从哪里开始。我在SO上找到了此脚本并使用了它。请帮助我解决我的问题。预先谢谢你。

zxl1125 回答:修复Shell脚本以增加semversion

编辑: :要仅更改MINOR版本,请尝试以下操作。

echo "$version" | awk 'BEGIN{FS=OFS="."} {$3+=1} 1'

说明: 在上述代码中添加说明。

echo "$version" |           ##using echo to print variable version value here and passing it to awk program.
awk '                       ##Starting awk program from here.
BEGIN{                      ##Starting BEGIN section of this awk program here.
  FS=OFS="."                ##Setting FS and OFS as dot(.) here for all lines of Input_file.
}
{
  $3+=1                     ##For every line of Input_file adding 1 to 3rd field and saving output to $3 itself.
}
1                           ##Mentioning 1 will print edited/non-edited lines here.
'


请问您可以尝试按照上一(次要)版本来更改中间版本,OP确认不需要,但我乍一看就知道了这一要求。

echo "$version" | awk 'BEGIN{FS=OFS="."} {$3+=1;if($3>9){$2+=1;$3=0}} 1'
,

纯Bash解决方案:

#!/usr/bin/env bash

version='1.27.9'

# Read Semver fields
IFS=. read -r major minor patch <<<"$version"

# Increment patch version
# same as patch="$((patch + 1))"
((patch++))

# Re-assemble version string from Semver fields
printf -v version '%d.%d.%d' "$major" "$minor" "$((patch))"
  • IFS=.;在.命令的本地范围内将字段分隔符设置为read
  • read -r major minor patch <<<"$version":从"$version此处的字符串中读取Semver字段。
  • ((patch++)):使用Bash的独立算法递增$patch版本。 (可以替换为patch="$((patch + 1))"
  • printf -v version '%d.%d.%d' "$major" "$minor" "$((patch))":使用Bash的$version(输出到变量)功能,将printf -v variable字符串格式化为具有更新的字段。

相当于@RavinderSingh13 's version的简写单行:

IFS=. read -r a b c<<<"$version";echo "$a.$b.$((c+1))"

本文链接:https://www.f2er.com/2881499.html

大家都在问