使用makefile脚本将返回值的值增加1

时间:2018-04-06 11:05:16

标签: linux bash shell makefile sh

我使用以下格式返回号码

v0.0.1

所以在这种情况下我需要将数字更改为

v0.0.2

如果我有

v0.0.9

我想将其更改为

v0.1.0

所以拥有...每次增加一个

我尝试的是以下

awk -F. '{$NF+=1; OFS="."; print $0}

哪个不起作用(给出相同的值),可能是什么问题?

我在VERSION=git describe --tags --abbrev=0 | awk -F. '{$NF+=1; OFS="."; print $0}'之前使用

哪个不起作用......

更新

当我尝试詹姆斯的代码时,我得到的值增加了dots而没有v

enter image description here

4 个答案:

答案 0 :(得分:3)

播放分隔符和记录重建:

$ 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。

答案 1 :(得分:2)

在增加列之前,需要设置OFS这个小问题。更糟糕的问题是你不处理9(0.0.9-> 0.1.0)的情况:

#!/bin/bash
awk -F. '{OFS="."; 
    printf("v");
    for(i=NF; i>0;i--) {
        $i++;
        if ($i<10) break;
        if(i>1) $i=0;
    }
}1'

这可以是一个单行,我只是把它放在脚本中以便于阅读。你会用它:

echo 9.9.9 | myscript.bash

另一个问题是溢出,由if(i>1)处理。请注意,输入不能包含v。如果您有bash VERSION=v1.2.3,则可以使用${VERSION:1}轻松获取相关子字符串。

答案 2 :(得分:2)

好吧,在bash函数中,这个怎么样?

$ function incv { printf "%03d\n" $((10#${1//[^0-9]/}+1)) | sed -E 's/(.)(.)(.)/v\1.\2.\3/'; }
$ incv v0.0.9
v0.1.0
$ incv v0.1.5
v0.1.6

这里的想法是:

  1. 我们删除非数字并将数字视为普通的基数10,
  2. 我们增加数字,
  3. 我们将该号码打印为零填充的3位数字,并按sed重新格式化。
  4. 我们可以单独使用bash中的sed部分,但这将是更多的工作....

    我认为唯一奇怪的部分是10#。其目的是确保将该数字解释为基数10,因为前导0可能会导致bash将该数字视为八进制。哪个对v0.0.9无效。 :)

答案 3 :(得分:1)

bash ,在@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"

<强>输出

v0.0.1  ->  v0.0.2
v0.0.9  ->  v0.1.0

bash 4.4.18(1)-release

<强>长凳

循环10000次迭代:

  • 仅限bash:8972 ms
  • with sed:16020 ms
  • with awk:24830 ms(脚本@JamesBrown)

执行时间不是质量的唯一标准,我将其发布以供参考