修复 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 --
: 清除参数数组。
我从未使用过 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))"
:打印升级后的次要 Semver10#
,并为 3rd 参数指定基数 10。IFS="$OIFS"
:将IFS
恢复为其原始值。set --
: 清除参数数组。