Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用makefile脚本将返回值的值增加1_Linux_Bash_Shell_Makefile_Sh - Fatal编程技术网

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}
哪个不起作用(给出相同的值),会有什么问题

我使用before
VERSION=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
  • 我们增加数字,然后
  • 我们将数字打印为零填充的3位数字,并通过sed重新格式化
  • 我们可以单独在bash中完成sed部分,但这将是更多的工作


    我认为唯一奇怪的是
    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
  • 我们增加数字,然后
  • 我们将数字打印为零填充的3位数字,并通过sed重新格式化
  • 我们可以单独在bash中完成sed部分,但这将是更多的工作


    我认为唯一奇怪的是
    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