【发布时间】: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
【问题讨论】:
我有一个包含三列和两位数字的版本号 (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
【问题讨论】:
作为使用 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 }'
【讨论】:
不需要任何花哨的东西(除了 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)。
【讨论】:
这很简单,只需要一些小数学技巧和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 语句之类的技巧来完成。
【讨论】:
这基本上可行,但可能会或可能不会进行字符串填充:
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 <<< "$IN"而不是cut来拆分$IN。
试试这个班轮:
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
注意,极端情况没有经过测试。
【讨论】: