Я 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 上并使用它。请帮我解决我的问题。先感谢您。
编辑:要仅更改次要版本,请尝试以下操作。
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)
纯 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 --
: 清除参数数组。