Linux 使用makefile脚本将返回值的值增加1
我已经用下面的格式返回了号码Linux 使用makefile脚本将返回值的值增加1,linux,bash,shell,makefile,sh,Linux,Bash,Shell,Makefile,Sh,我已经用下面的格式返回了号码 v0.0.1 所以在这种情况下,我需要将号码改为 v0.0.2 如果我有 v0.0.9 我想把它改成 v0.1.0 所以拥有…每增加一次 我试过的方法如下 awk -F. '{$NF+=1; OFS="."; print $0} 哪个不起作用(给出相同的值),会有什么问题 我使用beforeVERSION=git descripe--tags--abbrev=0 | awk-F.{$NF+=1;OFS=“.”“print$0}” 这是行不通的 更新 当我尝
v0.0.1
所以在这种情况下,我需要将号码改为
v0.0.2
如果我有
v0.0.9
我想把它改成
v0.1.0
所以拥有…每增加一次
我试过的方法如下
awk -F. '{$NF+=1; OFS="."; print $0}
哪个不起作用(给出相同的值),会有什么问题
我使用beforeVERSION=git descripe--tags--abbrev=0 | awk-F.{$NF+=1;OFS=“.”“print$0}”
这是行不通的
更新
当我尝试james的代码时,我得到的值在没有dots
和v
小问题是在增加列之前需要设置OFS。更糟糕的问题是您没有处理9的案例(0.0.9->0.1.0):
另一个问题是溢出,由
if(i>1)
处理。注意:输入不能包含v
。如果您在bash
VERSION=v1.2.3
,您可以使用${VERSION:1}
轻松获得相关的子字符串。小问题是在增加列之前需要设置OFS
。更糟糕的问题是您没有处理9的案例(0.0.9->0.1.0):
另一个问题是溢出,由
if(i>1)
处理。注意:输入不能包含v
。如果您在bash
VERSION=v1.2.3
,您可以通过${VERSION:1}
轻松获得相关的子字符串,使用分隔符和记录重建:
$ echo 0.0.9 |
awk '
BEGIN {
FS="." # set the separators
OFS=""
}
{
sub(/^v/,"") # remove the v
$1=$1 # rebuild record to remove periods
$0=sprintf("%03d",$0+1) # zeropad the number after adding 1 to it
}
END {
FS="" # reset the separators
OFS="."
$0=$0 # this to keep the value in $0
$1=$1 # rebuild to get the periods back
print "v" $0 # output
}'
v0.1.0
似乎与9.9.9->1.0.0.0一起工作。使用分隔符和重建记录:
$ echo 0.0.9 |
awk '
BEGIN {
FS="." # set the separators
OFS=""
}
{
sub(/^v/,"") # remove the v
$1=$1 # rebuild record to remove periods
$0=sprintf("%03d",$0+1) # zeropad the number after adding 1 to it
}
END {
FS="" # reset the separators
OFS="."
$0=$0 # this to keep the value in $0
$1=$1 # rebuild to get the periods back
print "v" $0 # output
}'
v0.1.0
似乎可以与9.9.9->1.0.0.0一起工作。在bash函数中,这个呢
$function incv{printf”%03d\n“$((10#${1/[^0-9]/}+1))| sed-E的/()/v\1.\2.\3/'}
$incv v0.0.9
v0.1.0
$incv v0.1.5
v0.1.6
这里的想法是:
我认为唯一奇怪的是
10
。其目的是确保数字被解释为基10,因为前导0可能会导致BASH考虑八进制数。对于v0.0.9
:)来说,这不起作用 那么,在bash函数中,这个呢
$function incv{printf”%03d\n“$((10#${1/[^0-9]/}+1))| sed-E的/()/v\1.\2.\3/'}
$incv v0.0.9
v0.1.0
$incv v0.1.5
v0.1.6
这里的想法是:
我认为唯一奇怪的是
10
。其目的是确保数字被解释为基10,因为前导0可能会导致BASH考虑八进制数。对于v0.0.9
:)来说,这不起作用 purebash,在@ghoti解决方案上
#!/bin/bash
increase_version(){
local string display c
string=$((10#${1//[^0-9]}+1))
string=$(printf "%03d\n" "$string" )
for (( c=0; c < ${#string}; c++ )); do
display+="${string:$c:1}."
done
echo "v${display::-1}"
}
echo -n "v0.0.1 -> " ; increase_version "v0.0.1"
echo -n "v0.0.9 -> " ; increase_version "v0.0.9"
echo -e "\nbash $BASH_VERSION"
工作台
循环10000次:
- 仅限bash:8972毫秒
- 与sed:16020毫秒
- 带awk:24830毫秒(脚本@JamesBrown)
执行时间不是质量的唯一标准,我将其发布在@ghoti solution上,以供参考
#!/bin/bash
increase_version(){
local string display c
string=$((10#${1//[^0-9]}+1))
string=$(printf "%03d\n" "$string" )
for (( c=0; c < ${#string}; c++ )); do
display+="${string:$c:1}."
done
echo "v${display::-1}"
}
echo -n "v0.0.1 -> " ; increase_version "v0.0.1"
echo -n "v0.0.9 -> " ; increase_version "v0.0.9"
echo -e "\nbash $BASH_VERSION"
工作台
循环10000次:
- 仅限bash:8972毫秒
- 与sed:16020毫秒
- 带awk:24830毫秒(脚本@JamesBrown)
执行时间不是质量的唯一标准,我发布它以供参考谢谢我使用make file我应该调整它吗?我想用make尝试一下,结果发现错误
makefile:3:**命令在第一个目标之前开始。停止。
我不知道你是如何运行生成文件的。如果你以前的方法有效,你可以用我的答案替换你的答案(没有#!行,把所有的东西放在一行上)。awk-F.{OFS=“.”for(i=NF;i>0;i--){$i++;If($i1)$i=0;}}1'
你能用makefile更新答案吗?这是关于makefile的问题。如果这解决了您的awk
问题,请将其标记为已接受,然后(在研究后)提出一个适当的问题,说明如何将命令放入Makefile
s。谢谢我正在使用make file我应该调整它吗?我想用make尝试一下,结果发现错误makefile:3:**命令在第一个目标之前开始。停止。
我不知道你是如何运行生成文件的。如果你以前的方法有效,你可以用我的答案替换你的答案(没有#!行,把所有的东西放在一行上)。awk-F.{OFS=“.”for(i=NF;i>0;i--){$i++;If($i1)$i=0;}}1'
你能用makefile更新答案吗?这是关于makefile的问题。如果这解决了您的awk
问题,请将其标记为已接受,然后(在研究后)提出一个适当的问题,说明如何将命令放入Makefile
s中。为什么希望0.0.9->0.1.0
而不是0.0.9->0.0.10
?如果希望semverbump
版本号不是浮点数;它们是带整数字段的虚线字符串。为什么要0.0.9->0.1.0
而不是0.0.9->0.0.10
?如果要semverbump
版本号不是浮点数;它们是带整型字段的虚线字符串。这是一个简洁的答案。你能给我一个简短的解释吗?你能告诉我文件应该是什么样子吗?我想测试一下,我对Makefiles不太在行,因为我已经20年没有接触过makefile了他们是谁
v0.0.1 -> v0.0.2
v0.0.9 -> v0.1.0
bash 4.4.18(1)-release