如何将这些bash函数修改为一个?

如何将这些bash函数修改为一个?

通常,这些会放入 .bashrc 文件中用作秒表,但使用和调用不同时间单位的多个不同命令时,它们有点不方便。

function time_seconds()
{
  echo "Counting to $1 seconds"
  time_func $1
}

function time_minutes()
{
  echo "Counting to $1 minutes"
  time_func $1*60
}

function time_hours()
{
  echo "Counting to $1 hours"
  time_func $1*60*60
}

function time_flexible()  # accepts flexible input hh:mm:ss (does not work)
{
    echo "Counting to $1"
    secs=$(time2seconds $1)
    time_func $secs
}

在此输入图像描述

我想将所有这些函数、命令转换为一个函数、一个命令。我想很多人会发现它几乎和 sleep 命令一样有用……好吧,不完全是……但仍然非常方便。说到 sleep 命令,它的工作原理如下,例如:

sleep 5h 22m 44s

我想将这些命令变成一个秒表命令,其中接受与睡眠命令完全相同的输入值,例如:

stopwatch 5h 22m 44s

我将如何实现这一目标?

ps 如果您看到所做的更改使此操作变得更简单、更容易,请随意修改秒表显示输出。

答案1

h假设您获得以普通秒为单位的持续时间或以,m和/或为后缀的正整数s,以下将计算持续时间为秒(但会不是验证提供的参数(无后缀)实际上是正整数,也不是非常小心地确保正确指定后缀):

to_seconds () {
    seconds=0

    for ts do
        case $ts in
            *h) seconds=$(( seconds + 60*60*"${ts%h}" )) ;;
            *m) seconds=$(( seconds +    60*"${ts%m}" )) ;;
             *) seconds=$(( seconds +       "${ts%s}" )) ;;
        esac
    done

    printf '%s\n' "$seconds"
}

函数中的循环将遍历给定的参数。

参数替换将从值的末尾${ts%h}删除尾随(如果有)。h$ts

如果将其5m 5m 5m用作参数,则将计算 15 分钟的秒数。

您应该能够在代码中使用它,可能不是以这种确切的形式(作为单独的函数),而是作为您当前正在编写的任何代码的一部分。

测试:

$ to_seconds 5h 22m 44s
19364
$ to_seconds 5h 22m 44
19364
$ to_seconds 44
44
$ to_seconds 10
10
$ to_seconds 10m
600
$ to_seconds 10h
36000
$ to_seconds 2i
bash: seconds +       2i: value too great for base (error token is "2i")

要验证给定数字是否为整数,请参阅

相关内容