用于发出分钟数蜂鸣声的 Bash 脚本

用于发出分钟数蜂鸣声的 Bash 脚本

我正在尝试写,如果时间在 0 分钟到 20 分钟之间,则没有响铃;如果时间在 20 分钟到 40 分钟之间,则响一声;如果时间在 40 分钟到 40 分钟之间,则响两声。整点 60 分钟,在两次钟声之间,睡眠 1 秒。

这是我的代码:

#!/bin/bash
time=$(date +%M)
count=0
sleep 1s # sleep for one second
let count=count+1
minute=$(date +%M)
if [[ $minute -gt 20 && $minute -le 39 ]]; then
echo -e "\a"
elif [[ $minute -gt 40 && $minute -le 59 ]]; then
echo -e "\a\a" && sleep 1s
else
    echo  -ne "\a"
fi

20s-40s 有效,但其他则无效,我该如何写蜂鸣声之间的睡眠。

实际上,我已经问过一次,但这是我第一次,所以我不知道这里的规则,对此我表示歉意,并且非常感谢您的帮助。

答案1

您可以通过两种方式解决这个问题:

  1. 将当前时间(以分钟为单位)与发出一两声铃声的范围(如您尝试的那样)进行比较,或者
  2. 请注意,给定的时间间隔采用偶数位,每个间隔 20 分钟,只需计算要产生的铃声数量即可。

在我看来,你有一点点太多了脚本中的代码。让我们首先删除所有未使用或最终不会使用的内容:

#!/bin/bash

minute=$(date +%M)  # or, in bash 4.2+: printf -v minute '%(%M)T' -1

if [[ $minute -gt 20 && $minute -le 39 ]]; then
    echo -e "\a"
elif [[ $minute -gt 40 && $minute -le 59 ]]; then
    echo -e "\a\a" && sleep 1s
else
    echo  -ne "\a"
fi

然后让我们看看您正在使用的逻辑:

  • 如果当前经过一小时的分钟数大于 20 且小于或等于 39,则您鸣响一次。这对我来说似乎没问题。

  • 如果当前经过一小时的分钟数大于 40 且小于或等于 59,则您会鸣响两次,然后休眠一秒钟。这似乎是一个问题,因为暂停可能应该到来之间两声钟声。您可以通过以下方式轻松解决此问题

    echo -e '\a'
    sleep 1
    echo -e '\a'
    

    另请注意,您的时间存在间隙。整点 40 分钟应该发生什么?

  • 不然的话,嗯……不然呢?else这里不需要分支。

我们可以稍微简化一下这个逻辑,并认识到如果时间超过了 20 分钟,那么至少应该有铃声。

if [ "$minute" -gt 20 ]; then
        echo chime
fi

如果时间超过 40 分钟,我们需要在暂停后添加另一个提示音:

if [ "$minute" -gt 40 ]; then
        sleep 1
        echo chime
fi

通过这种逻辑,您不必检查范围的末尾。

还有一个问题09。该%M格式将一小时后的分钟数格式化为用零填充的两位数。当一个数字以 开头0并且 shell 在算术上下文中使用它时,它会将其解释为八进制数字。对于00到范围内的数字来说这是可以的08,但这09是一个无效的八进制数。

您可以通过从 中删除初始零($minute如果有的话)来解决此问题:

minute=${minute#0}

显然,您应该在尝试使用该值之前执行此操作。


解决这个问题的另一种方法是计算要产生的铃声数量,然后只敲响那么多次:

for (( i = 0; i < (minute-1)/20; ++i )); do
        [ "$i" -ne 0 ] && sleep 1
        echo chime
done

这可以避免在初始铃声之前睡觉,但会在铃声之间增加暂停。这个会不是除非时间范围在整个小时内平均分配,否则工作就会正常进行。

相关内容