我正在寻找一个可以parsing一段时间的bash
脚本。
如果给出三个参数,它们代表小时,分钟和秒。 如果给出两个参数,则表示分钟和秒,小时为零。
那下面呢?
#!/bin/bash h=0 if [ "$#" -ge 3 ] then h=$1 shift fi sec=$((3600*$h+60*$1+$2)) echo "The total number of seconds is $sec"
由于该问题没有具体说明您在给定时间内的目标,程序会计算总秒数。 此外,如果至少给出两个参数,那么做一个检查也许是有用的。
脚本使用shift
操作,移位使得$1 := $2
; $2 := $3
等。换句话说,第一个参数被处理,然后你“假装”它永远不存在。
默认情况下,您将h
设置为零,并且只有当参数的数量大于或等于3
,才会设置h
。
对于这种类型的任务,这是一个或多或少的一般解决方案。 对不起,如果是猴子码,但我觉得这足够了:
gettime() { params=( years months weeks days hours minutes seconds ) for i in `seq ${#params}`; do param_i=$((${#params} - i + 1)) # reversed params index [ $i -le $# ] && { eval "local ${params[$param_i]}=\$$(($# - i + 1))" } || { eval "local ${params[$param_i]}=0" } eval "echo ${params[$param_i]} '==' \$${params[$param_i]}" # debug output done }
以下是示例输出:
$ gettime 3 4 5 6 7 seconds == 7 minutes == 6 hours == 5 days == 4 weeks == 3 months == 0 years == 0
请注意,您使用的外壳必须不仅支持POSIX标准,而且还支持数组。
第一个参数:$ 1
第二个参数:$ 2
第三个参数:$ 3
等等…
例:
bash-2.05a$ ./parseDuration.sh 13 25 25 13 hours and 25 minutes and 25 seconds bash-2.05a$ cat ./parseDuration.sh #!/bin/bash echo "$1 hours and $2 minutes and $3 seconds"