脚本会发出小时数的蜂鸣声。也就是说,如果您在 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
也就是说,您确实应该养成缩进代码的习惯。它极大地提高了可读性,任何像样的编辑器都会为你做到这一点。另请注意,如果分钟正好30
或45
因为您使用的是-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