Linux 如何使用shell脚本增加版本号?

Linux 如何使用shell脚本增加版本号?,linux,bash,shell,sh,Linux,Bash,Shell,Sh,我有一个三列两位数的版本号(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 这基本上是可行的,但可能会也可能不会进行字符串填充: IN=43:99:99 F1=`echo $IN | cut -f1 '-d:'` F2=`echo $IN

我有一个三列两位数的版本号(
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

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

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

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

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

作为使用awk的单行程序,假设VERSION是一个变量,其中包含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 }'

作为使用awk的单行程序,假设VERSION是一个变量,其中包含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 }'

这很简单,只需要一些小的数学技巧和
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}
#/bin/bash
#将版本从$1读入版本

IFS=':'read-r-aver很简单,只需要一些小的数学技巧和
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}
#/bin/bash
#将版本从$1读入版本
如果=':'read-r-aver试试下面这一行:

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
kent$awk'{gsub(/:/,“”);$0++;gsub(///,“&:”;sub(/:$/,“”)}7'试试这一行:

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
kent$awk'{gsub(/:/,“”);$0++;gsub(///,“&:”;sub(/:$/,“”)}7'不需要任何花哨的东西(除了Bash):

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

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

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

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


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

您可以使用
IFS=:read-r F1 F3@andlrc Cool!我不知道bash中的内部字段分隔符。这需要一些工作来处理前导零,既要在算术后恢复它们,又要避免使用base-8算术。您可以使用
IFS=:read-r F1 F2 F3@andlrc Cool!我不知道bash中的内部字段分隔符。这需要一些工作来处理前导零,既要在算术后恢复它们,又要避免使用8进制算术。如果主版本号小于10,则不起作用,例如,
09:00:00
@gniourf\u gniourf是的,它改进了:)如果主版本号小于10,则不起作用,例如。,
09:00:00
@gniourf\u gniourf是的,它改进了:)