修复 shell 脚本以增加 semversion

Fix shell script to increment semversion

我从未使用过 shell (bash),但在脚本中发现了一些错误,我曾用它来增加版本。脚本工作正常,直到这种情况

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。如何更改此脚本以避免增加次要编号?对于这种情况,我期待 1.27.10

我没有 shell 方面的经验,所以不知道从哪里开始。我在这里找到了这个脚本,在 SO 上并使用它。请帮我解决我的问题。提前谢谢你。

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

echo "$version" | awk 'BEGIN{FS=OFS="."} {+=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.
}
{
  +=1                     ##For every line of Input_file adding 1 to 3rd field and saving output to  itself.
}
1                           ##Mentioning 1 will print edited/non-edited lines here.
'


能否请您尝试按照最后(次要)版本更改中间版本,OP 确认不需要但我第一眼就明白了这个要求。

echo "$version" | awk 'BEGIN{FS=OFS="."} {+=1;if(>9){+=1;=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 here-string 中读取 Semver 字段。
  • ((patch++)):使用 Bash 的独立算法增加 $patch 版本。 (可以换成patch="$((patch + 1))"
  • printf -v version '%d.%d.%d' "$major" "$minor" "$((patch))":使用 Bash 的 printf -v variable(输出到变量)功能,用更新的字段格式化 $version 字符串。

相当于:

的简写单行

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

或 POSIX 一行:

OIFS="$IFS";IFS=.;set -- $version;echo "..$((10#+1))";IFS="$OIFS";set --
  • OIFS="$IFS":保存I内部F字段S分隔符。
  • IFS=.: 将点设置为字段分隔符。
  • set -- $version:使用 IFS.
  • 将版本字符串拆分为参数
  • echo "..$((10#+1))":打印升级后的次要 Semver 10#,并为 3rd 参数指定基数 10。
  • IFS="$OIFS":将 IFS 恢复为其原始值。
  • set --: 清除参数数组。