신호음이 울리는 시간을 위한 Bash 스크립트

신호음이 울리는 시간을 위한 Bash 스크립트

시간이 0분에서 20분 사이이면 벨이 울리지 않고, 20분에서 40분 사이이면 벨이 울리고, 40분에서 40분 사이이면 벨이 한 번 울리도록 작성하려고 합니다. 40분이 지나면 벨소리가 2번 울립니다. 매시 60분, 두 개의 벨이 울리는 사이에 1초 동안 잠을 자세요.

이것은 내 코드입니다.

#!/bin/bash
time=$(date +%M)
count=0
sleep 1s # sleep for one second
let count=count+1
minute=$(date +%M)
if [[ $minute -gt 20 && $minute -le 39 ]]; then
echo -e "\a"
elif [[ $minute -gt 40 && $minute -le 59 ]]; then
echo -e "\a\a" && sleep 1s
else
    echo  -ne "\a"
fi

20~40대는 되는데 남들은 안되는데 삐 소리 사이에 잠을 어떻게 쓸 수 있나요?

사실 한 번 물어본 적이 있는데 처음이라 규칙을 잘 몰라서 죄송하고 도움을 주시면 정말 감사하겠습니다.

답변1

이 문제는 두 가지 방법으로 해결할 수 있습니다.

  1. 분 단위로 현재 시간을 하나 또는 두 개의 벨소리 범위(시도한 대로)와 비교하거나
  2. 주어진 시간 간격은 각각 20분의 짝수이므로 생성할 벨소리 수를 계산하십시오.

제가 보기엔 당신이 좀 있는 것 같아요너무 많은스크립트의 코드. 사용되지 않거나 최종적으로 사용되지 않을 항목을 제거하는 것부터 시작해 보겠습니다.

#!/bin/bash

minute=$(date +%M)  # or, in bash 4.2+: printf -v minute '%(%M)T' -1

if [[ $minute -gt 20 && $minute -le 39 ]]; then
    echo -e "\a"
elif [[ $minute -gt 40 && $minute -le 59 ]]; then
    echo -e "\a\a" && sleep 1s
else
    echo  -ne "\a"
fi

그런 다음 사용 중인 논리를 살펴보겠습니다.

  • 현재 시간의 분 수가 20보다 크고 39보다 작거나 같으면 차임벨이 한 번 울립니다. 제가 보기에는 괜찮은 것 같습니다.

  • 현재 시간의 분이 40보다 크고 59보다 작거나 같으면 차임벨이 두 번 울리고 1초 동안 잠을 자게 됩니다. 아마도 일시정지가 와야 하므로 문제가 있는 것 같습니다.~ 사이벨 2개. 다음 방법으로 이 문제를 쉽게 해결할 수 있습니다.

    echo -e '\a'
    sleep 1
    echo -e '\a'
    

    또한 시간에 공백이 있다는 점에 유의하세요. 매시 40분에는 무슨 일이 일어나야 할까요?

  • 그렇지 않으면 음... 만약에? else여기서는 분기가 필요하지 않습니다.

이 논리를 약간 단순화하여 시간이 20분보다 길면 최소한 벨소리가 있어야 한다는 것을 알 수 있습니다.

if [ "$minute" -gt 20 ]; then
        echo chime
fi

시간이 40분을 초과하면 일시 중지 후 다른 신호음을 추가해야 합니다.

if [ "$minute" -gt 40 ]; then
        sleep 1
        echo chime
fi

이 논리를 사용하면 범위의 끝을 확인할 필요가 없습니다.

아직 질문이 있습니다 09. 이 %M형식은 시간 이후의 분 수를 0으로 채워진 두 자리 숫자로 형식화합니다. 숫자가 다음으로 시작 0하고 쉘이 이를 산술적 맥락에서 사용하면 다음과 같이 해석합니다.8진수숫자. 00범위 내의 숫자 에는 문제가 없지만 유효하지 08않은 098진수입니다.

초기 0을 제거하여( $minute있는 경우) 이 문제를 해결할 수 있습니다.

minute=${minute#0}

분명히 이 값을 사용하기 전에 이 작업을 수행해야 합니다.


이 문제를 해결하는 또 다른 방법은 생성할 벨 수를 세어 해당 횟수만큼만 울리는 것입니다.

for (( i = 0; i < (minute-1)/20; ++i )); do
        [ "$i" -ne 0 ] && sleep 1
        echo chime
done

이렇게 하면 초기 차임벨이 울리기 전에 잠을 자지 않아도 되지만 차임벨 사이에 일시 중지가 추가됩니다. 이것은아니요1시간 단위로 시간이 균등하게 배분되지 않는 한 작업은 정상적으로 진행됩니다.

관련 정보