我正在尝试写,如果时间在 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
您可以通过两种方式解决这个问题:
- 将当前时间(以分钟为单位)与发出一两声铃声的范围(如您尝试的那样)进行比较,或者
- 请注意,给定的时间间隔采用偶数位,每个间隔 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
这可以避免在初始铃声之前睡觉,但会在铃声之间增加暂停。这个会不是除非时间范围在整个小时内平均分配,否则工作就会正常进行。