퇴근 시간에 경고음을 울리는 Bash 스크립트

퇴근 시간에 경고음을 울리는 Bash 스크립트

스크립트는 몇 시간 동안 경고음을 울립니다. 즉, 10시에 스크립트를 실행하면 경고음이 10번 울립니다. 그리고 3초 정도 멈춘 후 분이 15~30분이면 1번 울리게 하고, 30~45분이면 2번 울리게 하고, 45~60분이면 2번 울리게 해야 합니다. , 경고음을 세 번 울려야했습니다. 처음 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. 그러나 testAfter가 없으므로 명령으로 실행 &&하려고 시도했지만 실패합니다. $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번 울리게 됩니다. time 12:00:01더 이상 신호음이 울리지 않아 청취자가 시간이 11:00과 사이에 있다고 생각하게 됩니다. 올바른 시간에 신호음이 울리도록 스크립트 시작 부분에 및 를 11:15설정하고 싶지 않으십니까 ? 바꾸지 마세요. 당신이 원하는 것이 무엇인지 모르니까요.timeminute

답변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

관련 정보