【问题标题】:Write a bash script that accepts a time duration as arguments?编写一个接受持续时间作为参数的bash脚本?
【发布时间】:2015-09-18 23:23:48
【问题描述】:

我正在寻找可以解析持续时间的bash 脚本。

如果给出三个参数,它们分别代表小时、分钟和秒。如果给出了两个参数,它们代表分钟和秒,小时为零。

【问题讨论】:

  • 参数不代表一天中的某个时间——它们代表持续时间,即做某事需要多长时间。
  • 使用sleep评估?
  • @ReubenL.: 你能解释一下如何用sleep解析吗?
  • 你为什么要这样做?这不是家庭作业,是吗?

标签: linux bash time duration


【解决方案1】:

下面的呢:

#!/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

【讨论】:

  • 哇,不知道班次。似乎是一个有用的功能。
  • shiftseveral 语言中很方便
【解决方案2】:

对于这类任务,这或多或少是一个通用的解决方案。抱歉,如果是猴子代码,但我认为就足够了:

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

请注意,您使用的 shell 必须不仅支持 POSIX 标准,还必须支持数组。

【讨论】:

    【解决方案3】:

    第一个参数:$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"
    

    【讨论】:

    • 我认为 OP 意味着如果给出两个参数,则第一个和第二个分别被解释为分钟和秒。
    • 感谢您的回复。那么我该如何规范化。例如,我们不会说“两分六十五秒”。相反,我们说“三分五秒。基本上,我怎样才能将值溢出到下一个更高的单位。renge是00-59。
    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2010-11-05
    • 2012-10-07
    • 2021-06-07
    相关资源
    最近更新 更多