【问题标题】:increase value of returned value by 1 with makefile script使用 makefile 脚本将返回值的值增加 1
【发布时间】:2018-04-06 11:05:15
【问题描述】:

我返回了以下格式的号码

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}'

这不起作用...

更新

当我尝试 james 的代码时,我得到的价值在没有 dots 和没有 v 的情况下增加了

【问题讨论】:

  • 你为什么要0.0.9 -> 0.1.0而不是0.0.9 -> 0.0.10
  • 如果你想semverbumpgithub.com/nbari/semverbump
  • 版本号不是浮点数;它们是带有整数字段的虚线字符串。

标签: linux bash shell makefile sh


【解决方案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。

【讨论】:

  • 这是一个简洁的答案。能简单解释一下吗?
  • 您能否展示一下 makfile 的外观?我想测试它,我对 makfile 等不太熟悉
  • 我已经有 20 年没有碰过 makefile 了。 :D 他们还是make他们? :D :D
  • 很抱歉,无法为您提供帮助。我需要拿到我的 K&R,这会使我的桌子不稳定。
【解决方案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&gt;1) 处理。请注意,输入不能包含v。如果你有bashVERSION=v1.2.3,你可以很容易地用${VERSION:1}得到相关的子串。

【讨论】:

  • 谢谢我使用make文件我应该调整它吗?我想用 make 尝试一下,我得到了错误makefile:3: *** commands commence before first target. Stop.
  • 我不知道你是如何运行你的Makefile的。如果你之前的工作有效,你可以用我的答案替换你的行(没有 #! 行,只需将所有内容放在一行上)。
  • awk -F. '{OFS="."; for(i=NF; i&gt;0;i--) { $i++; if ($i&lt;10) break; if(i&gt;1) $i=0; } }1'
  • 你能用makefile的例子更新答案吗?
  • 这是关于 Makefile 的问题。如果这解决了您的awk 问题,请将其标记为已接受,然后问一个适当的问题(经过研究)如何在Makefiles 中输入命令。
【解决方案3】:

好吧,在 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 重新格式化。

我们可以单独在 bash 中完成 sed 部分,但工作量会更大......

我认为这其中唯一奇怪的部分是10#。其目的是确保该数字被解释为以 10 为底,因为前导 0 可能会导致 bash 将该数字视为八进制。这不适用于v0.0.9。 :)

【讨论】:

  • 谢谢,但是我需要用make文件检查,请问可以采用makefile吗?\
  • 我在您的问题中没有看到任何相关内容。我提供的功能是您提供的代码尝试的可行替代方案。请问update your question有您的实际需求吗?
  • 谢谢,我已经更新了问题:) 顺便说一句,当我打开问题时,我已经把它和 makefile 的标签放在了一起:)
  • @Ninawatcher,我仍然没有看到任何关于 Makefile 的问题。主题中的“with makefile script”文本是不够的。你想用 Makefile 做什么?在您的问题中添加MCVE,以明确您在做什么。实际上,您的问题仅包含尝试增加版本号的代码,这就是为什么您收到的所有答案都向您展示..如何增加版本号。
  • 之前的代码是VERSION=git describe --tags --abbrev=0 | awk -F。 '{$NF+=1; OFS="."; print $0}'`这不起作用,我怎样才能改变它以使用你的代码来测试它,你能帮忙吗?
【解决方案4】:

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 毫秒
  • 使用 sed:16020 毫秒
  • 使用 awk:24830 毫秒(脚本 @JamesBrown)

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

【讨论】:

  • 顺便说一句,当我尝试运行您提供的脚本时出现错误v0.0.1 -&gt; ./bs.sh: line 11: -1: substring expression &lt; 0 v0.0.9 -&gt; ./bs.sh: line 11: -1: substring expression &lt; 0 bash 3.2.57(1)-release
  • 知道为什么会这样吗?我用的是 mac……我做了chmod +x
  • 对不起,我不知道为什么。您使用 bash 3.2,但使用 compat32,我对我有用:/ 我假设错误在 echo "v${display::-1}"?你能用echo "v${display:0:-1}"echo "v${display%\.}"测试吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多