【问题标题】:Fix shell script to increment semversion [duplicate]修复 shell 脚本以增加 semversion [重复]
【发布时间】:2020-04-13 13:56:07
【问题描述】:

我从未使用过 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。如何更改此脚本以避免增加 MINOR 编号?对于这种情况,我期待1.27.10

我没有shell经验,所以不知道从哪里开始。我在 SO 上找到了这个脚本并使用它。请帮我解决我的问题。提前谢谢你。

【问题讨论】:

    标签: bash shell awk semantic-versioning


    【解决方案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 &lt;&lt;&lt;"$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 字符串。

    相当于@RavinderSingh13 's version的简写单行:

    IFS=. read -r a b c&lt;&lt;&lt;"$version";echo "$a.$b.$((c+1))"

    或 POSIX 单行:

    OIFS="$IFS";IFS=.;set -- $version;echo "$1.$2.$((10#$3+1))";IFS="$OIFS";set --
    
    • OIFS="$IFS":保存I内部F字段S分隔符。
    • IFS=.:将点设置为字段分隔符。
    • set -- $version:使用IFS 将版本字符串拆分为参数。
    • echo "$1.$2.$((10#$3+1))":打印升级后的次要 Semver 10#$3,并为 3rd 参数指定基数 10。
    • IFS="$OIFS":将IFS 恢复为其原始值。
    • set --:清除参数数组。

    【讨论】:

    • $((patch++)) bash: 9: command not found
    • @Chebur 通过删除独立算法前面的$ 修复了问题。还添加了替代方法。
    【解决方案2】:

    编辑:要仅更改次要版本,请尝试以下操作。

    echo "$version" | awk 'BEGIN{FS=OFS="."} {$3+=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.
    }
    {
      $3+=1                     ##For every line of Input_file adding 1 to 3rd field and saving output to $3 itself.
    }
    1                           ##Mentioning 1 will print edited/non-edited lines here.
    '
    


    您能否尝试按照最后(次要)版本更改中间版本,OP 确认不需要但我第一眼就理解了这个要求。

    echo "$version" | awk 'BEGIN{FS=OFS="."} {$3+=1;if($3>9){$2+=1;$3=0}} 1'
    

    【讨论】:

    • 同样的结果——1.28.0,当版本是1.27.9时我需要1.27.10
    • @Chebur,啊,我想反之亦然:) 让我马上修复它。
    • @Chebur,请检查我的 EDIT 解决方案,让我知道这是否对您有帮助?
    • 非常感谢你。你是超级英雄,你怎么知道这里发生了什么{$3+=1} :) 为我疯狂的表达$3+=1;if($3&gt;9){$2+=1;$3=0 )))
    • @Chebur,感谢您的赞美 :) $3+=1 正在将 1 添加到最后一个字段并将其结果保存到第三个字段本身,请在几分钟内添加完整的解释,并让您知道。
    猜你喜欢
    • 2014-02-12
    • 2015-09-01
    • 2014-06-11
    • 2023-03-12
    • 2017-06-01
    • 2019-05-12
    • 1970-01-01
    • 2011-07-05
    • 2011-08-24
    相关资源
    最近更新 更多