用于发出不工作小时数蜂鸣声的 Bash 脚本

用于发出不工作小时数蜂鸣声的 Bash 脚本

脚本会发出小时数的蜂鸣声。也就是说,如果您在 10 点运行脚本,它会发出 10 次蜂鸣声。此外,在暂停 3 秒后,如果分钟在 15-30 之间,我必须让它发出蜂鸣声一次,如果在 30-45 之间,我必须让它发出两次蜂鸣声,如果在 45-60 之间,我必须让它发出三次蜂鸣声。前 15 分钟不得发出蜂鸣声。这是我到目前为止所想出的:

#!/bin/bash
time=$(date +%I)
count=0
while test $count -lt $time; do
echo -e "\a"
sleep 1 # sleep for one second
let count=count+1
done
sleep 3
minute=$(date +%M)
if test $minute -gt 15 && $minute -lt 30; then
echo -e "\a"
elif test $minute -gt 30 && $minute -lt 45; then
echo -e "\a"
echo -e "\a"
elif test $minute -gt 45 && $minute -lt 60; then
echo -e "\a"
echo -e "\a"
echo -e "\a"
else echo "No Chime"
fi

代码的第一部分工作正常。例如,如果时间为 11 点 25 分,则蜂鸣器响 11 声并暂停 3 秒。但之后就没有提示音了

line 11: 25: command not found
line 13: 25: command not found

我也检查了 shellcheck,它没有返回任何错误。然而,该代码似乎不起作用。

我该如何让它发挥作用?

谢谢

答案1

你的错误在这里:

elif test $minute -gt 30 && $minute -lt 45; then

内置test是一个命令。所以上面的行正在运行command1 && command2。但是,您没有test之后,&&因此它尝试$minute作为命令运行并失败。你本来想写:

elif test $minute -gt 30 && test $minute -lt 45; then

下一张也一样:

elif test $minute -gt 45 && test $minute -lt 60; then

也就是说,您确实应该养成缩进代码的习惯。它极大地提高了可读性,任何像样的编辑器都会为你做到这一点。另请注意,如果分钟正好3045因为您使用的是-lt(小于)而不是-le(小于或等于),则您的脚本将无法工作因此,脚本的更好版本将是:

#!/bin/bash
time=$(date +%I)
count=0
while [ "$count" -lt "$time" ]; do
        echo -ne "\a"
        sleep 1 # sleep for one second
        let count=count+1
done
sleep 3
minute=$(date +%M)
if [[ $minute -gt 15 && $minute -le 30 ]]; then
     echo -ne "\a"
elif [[ $minute -gt 30 && $minute -le 45 ]]; then
        echo -ne "\a\a"
elif [[ $minute -gt 45 && $minute -lt 60 ]]; then
        echo -ne '\a\a\a'
else
        echo "No Chime"
fi

当然,因为您睡了这么多秒,所以嘟嘟声代表的时间并不是您启动脚本的时间(例如,如果在 11:59:50 运行,您将发出 11 声嘟嘟声;到那时,时间到了12:00:01,您将不再发出任何蜂鸣声,让听众认为时间在11:00和之间11:15。您确定不想在脚本的开头设置time和,以便它在正确的时间向您发出蜂鸣声吗?minute我没有改变它,因为我不知道你想要什么。

答案2

具体bash而言,您可以执行以下操作:

#! /bin/bash -
printf -v code '%(
   h_chimes=%-I m_chimes=$((%-M/15))
)T' -1
eval "$code"

nbeep() for ((i = 0; i < $1; i++)) {
  ((i == 0)) || sleep 1
  printf '\a'
}

nbeep "$h_chimes"
if ((m_chimes > 0)); then
  sleep 3
  nbeep "$m_chimes"
fi

相关内容