bash 倒计时(向上?)计时器 w/alarm:改进?

bash countdown(up?) timer w/alarm: improvements?

MIN=1 && for i in $(seq $(($MIN*5)) -1 1); do echo -n "$i, "; sleep 60; done; while :; do beep -r 25 -l 3; sleep 5; done

我最近决定尝试使用 pomodoro work/learning 技术,并且由于我通常使用计算机工作,因此希望能够拼凑出一个 countdown/up 带闹钟的计时器运行s 在我工作的机器上。简而言之,我想按分钟计算 down/up 25 分钟或 5 分钟的间隔,然后发出警报声——警报声一直响到重置。顺便说一句,我希望这是一个非图形用户界面的解决方案,我可以从终端运行

在网上搜索后,我想出了一些可行的方法(主要取自 http://www.commandlinefu.com/commands/view/5886/countdown-clock )——见上文。它倒计时并按分钟显示剩余时间,当指定的间隔结束时,它会每 5 秒播放一次独特但相当非侵入性的系统铃声模式(使用 "beep" 程序),直到 ctrl+c 在脚本来自的终端中输入 运行.

就像我说的,我放在一起的东西似乎很适合我的需要。但是由于我对 bash 的理解非常有限——因为通过查看脚本,任何具有 bash 脚本编写经验的人都应该明白这一点——我想我会在这里问一下可能会有哪些改进被制作成这个剧本?是否可以进一步压缩,and/or 也许使用不同的实用程序来实现相同的目的,但以更优雅的方式?将不胜感激。

后期编辑:在我看来,Zoltan 将 MIN=1 && for i in $(seq $(($MIN*5)) -1 1); 替换为 for i in $(seq 5 -1 1); 的建议在某种程度上简化并改进了我发布的脚本。因此,作为单行的更明智的版本是 for i in $(seq 5 -1 1); do echo -n "$i, "; sleep 60; done; while :; do beep -r 25 -l 3; printf " # "; sleep 5; done。他发布的版本似乎确实是一个功能更强大、更灵活的脚本,所以我将其标记为最佳答案。虽然有一个可用的选项很好,但我想我会继续使用我创建的版本(包括 Zoltan 建议的轻微改进和我认为每次哔声消失时添加一个哈希符号的版本 [给我一个想法,以防万一我离开计算机,它发出哔哔声的时间]-- printf " # " 部分)将时间间隔硬编码到脚本中。感谢您的输入。

你可以在里面做无限循环你只会调用 beep 我认为你不需要循环你可以睡一段时间 beep 然后回到那个状态 运行 它在 subshel​​l

#infinite loop with beep man beep to understand better -r and -l switch
time=$((60*5))
current=0
while :
do
 #echo "Current time is: "
 #date  | egrep -o [0-9]+:[0-9]+:[0-9]+

  current=$(($current+$time / 60))
  echo "time of execution : $current min";
  beep -r 25 -l 10
  sleep $time
done

我不确定我是否理解你的问题,但解决方案只取决于你,如果你想要一个每分钟计数的计时器,那么解决方案不会比你在上面发布的那个更容易。

我觉得你的剧本很公平

我真的不明白

中 && 的意义
MIN=1 && for

意思是,如果第一个任期成功,才执行第二个任期。我什至不确定,赋值的逻辑值是多少,但可以安全地假设,它是成功的。所以一个

MIN=1; for ...

应该足够了。

至于这个 2-liner,整个 MIN=1 似乎毫无意义,你可以写

for i in $(seq 5 -1 1); do ...

另一方面,您可能希望能够更改分配的时间,可以这样实现:

1) 创建一个类似 beeper.sh

的文件

2) 使其可由您的用户执行

chmod u+x beeper.sh

或所有用户:

chmod a+x beeper.sh

3) 在文件中编写脚本,稍微调整一下:

#!/bin/bash

# default timeout
timeout_mins=5
# while testing your script, making changes, you want this to be something like 1 or 2
sec_per_min=60

# check for command line input
if [ 0 -ne $# ]
then
    # assign the first command line param, no check, if it is a number, though!
    timeout_mins=
fi

# now it does make sense, to have a variable in the for loop core
for i in $(seq $timeout_mins -1 1)
do
    echo -n "$i, "
    sleep $sec_per_min
done

while :
do
    beep -r 25 -l 3
    sleep 5
done

4) 像这样执行你的脚本(从脚本文件所在的目录):

# using the default time
./beeper.sh

# using 9min
./beeper.sh 9

# invalid input: the seq will fail -> the for will fail -> execute the beep
./beeper.sh bla