修复 shell 脚本以增加 semversion

Я T*_*bur 3 bash shell awk semantic-versioning

我从来没有使用过 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
Run Code Online (Sandbox Code Playgroud)

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

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

Rav*_*h13 8

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

echo "$version" | awk 'BEGIN{FS=OFS="."} {$3+=1} 1'
Run Code Online (Sandbox Code Playgroud)

说明:对上述代码添加说明。

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

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

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


Léa*_*ris 6

纯 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))"
Run Code Online (Sandbox Code Playgroud)
  • IFS=.; 将字段分隔符设置.为在read命令的本地范围内。
  • read -r major minor patch <<<"$version":从"$version此处的字符串中读取 Semver 字段。
  • ((patch++))$patch使用 Bash 的独立算法增加版本。(可以换成patch="$((patch + 1))"
  • printf -v version '%d.%d.%d' "$major" "$minor" "$((patch))"$version使用 Bash 的printf -v variable(输出到变量)功能使用更新的字段格式化字符串。

相当于@RavinderSingh13 版本的简写一行:

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

或 POSIX 单线:

OIFS="$IFS";IFS=.;set -- $version;echo "$1.$2.$((10#$3+1))";IFS="$OIFS";set --
Run Code Online (Sandbox Code Playgroud)
  • OIFS="$IFS":保存nternal ˚F ield小号eparator。
  • IFS=.: 将点设置为字段分隔符。
  • set -- $version: 将版本字符串拆分为参数,使用IFS.
  • echo "$1.$2.$((10#$3+1))":打印升级的次要 Semver,10#$3并为第三个参数指定基数 10 。
  • IFS="$OIFS":将 恢复IFS为原始值。
  • set --: 清除参数数组。