通常,这些会放入 .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")
要验证给定数字是否为整数,请参阅