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
04.05.2017, 15:10
2 ответа

Ваша ошибка здесь:

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

4
28.01.2020, 05:07

В частности, с 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
0
28.01.2020, 05:07

Теги

Похожие вопросы