Сценарий подает звуковой сигнал количество часов. То есть, если вы запустите скрипт на 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, и он не возвращает ошибок. Тем не менее, код, похоже, не работает.
Как заставить его работать?
Спасибо
Ваша ошибка здесь:
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
). Вы уверены, что не хотите установить время
и минуту
в самом начале скрипта, чтобы он пропищал вам нужное время? Я не изменил это, так как я не знаю, что вы хотите.
В частности, с 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