【问题标题】:How to increment version number using shell script?如何使用 shell 脚本增加版本号?
【发布时间】:2016-06-23 15:22:47
【问题描述】:

我有一个包含三列和两位数字的版本号 (xx:xx:xx)。谁能告诉我如何使用shell脚本增加它。

Min Value
00:00:00

Max Value
99:99:99

Sample IO
10:23:56 -> 10:23:57
62:54:99 -> 62:55:00
87:99:99 -> 88:00:00

【问题讨论】:

    标签: linux bash shell sh


    【解决方案1】:

    作为使用 awk 的单行,假设 VERSION 是一个变量,其中包含版本:

    echo $VERSION | awk 'BEGIN { FS=":" } { $3++;  if ($3 > 99) { $3=0; $2++; if ($2 > 99) { $2=0; $1++ } } } { printf "%02d:%02d:%02d\n", $1, $2, $3 }'
    

    【讨论】:

      【解决方案2】:

      不需要任何花哨的东西(除了 Bash):

      $ ver=87:99:99
      $ echo "$ver"
      87:99:99
      $ printf -v ver '%06d' $((10#${ver//:}+1))
      $ ver=${ver%????}:${ver: -4:2}:${ver: -2:2}
      $ echo "$ver"
      88:00:00
      

      我们只是使用参数扩展${ver//:} 删除冒号:然后我们留下一个通常的十进制数,将其递增并使用printf 重新格式化它;然后使用更多的参数扩展来对数字进行分组。

      这假定 ver 已经被彻底检查(使用正则表达式或 glob)。

      【讨论】:

        【解决方案3】:

        这很简单,只需要一些小数学技巧和bc 命令,方法如下:

        #!/bin/bash
        
        # read VERSION from $1 into VER
        IFS=':' read -r -a VER <<< "$1"
        
        # increment by 1
        INCR=$(echo "ibase=10; ${VER[0]}*100*100+${VER[1]}*100+${VER[2]}+1"|bc)
        
        # prepend zeros
        INCR=$(printf "%06d" ${INCR})
        
        # output the result
        echo ${INCR:0:2}:${INCR:2:2}:${INCR:4:2}
        

        如果您需要溢出检查,您可以使用 INCR 语句之类的技巧来完成。

        【讨论】:

        • 如果主版本号 09:00:00。
        • @gniourf_gniourf 是的,它改进了:)
        【解决方案4】:

        这基本上可行,但可能会或可能不会进行字符串填充:

        IN=43:99:99
        F1=`echo $IN | cut -f1 '-d:'`
        F2=`echo $IN | cut -f2 '-d:'`
        F3=`echo $IN | cut -f3 '-d:'`
        
        F3=$(( F3 + 1 ))
        if [ "$F3" -gt 99 ] ; then F3=00 ; F2=$(( F2 + 1 )) ; fi
        if [ "$F2" -gt 99 ] ; then F2=00 ; F1=$(( F1 + 1 )) ; fi
        
        OUT="$F1:$F2:$F3"
        echo $OUT
        

        【讨论】:

        • 你可以使用IFS=: read -r F1 F2 F3 &lt;&lt;&lt; "$IN"而不是cut来拆分$IN
        • @andlrc 酷!我不知道 bash 中的内部字段分隔符。
        • 这需要一些工作来处理前导零,在算术之后恢复它们并避免以 8 为基数的算术。
        【解决方案5】:

        试试这个班轮:

        awk '{gsub(/:/,"");$0++;gsub(/../,"&:");sub(/:$/,"")}7'
        

        测试:

        kent$  awk '{gsub(/:/,"");$0++;gsub(/../,"&:");sub(/:$/,"")}7' <<< "22:33:99"
        22:34:00
        
        kent$  awk '{gsub(/:/,"");$0++;gsub(/../,"&:");sub(/:$/,"")}7' <<< "22:99:99"
        23:00:00
        
        kent$  awk '{gsub(/:/,"");$0++;gsub(/../,"&:");sub(/:$/,"")}7' <<< "22:99:88"
        22:99:89
        

        注意,极端情况没有经过测试。

        【讨论】:

          猜你喜欢
          • 2012-01-29
          • 2017-05-03
          • 2018-09-25
          • 1970-01-01
          • 1970-01-01
          • 2014-02-21
          • 2014-04-04
          • 2020-04-01
          • 1970-01-01
          相关资源
          最近更新 更多