스크립트는 몇 시간 동안 경고음을 울립니다. 즉, 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
. 그러나 test
After가 없으므로 명령으로 실행 &&
하려고 시도했지만 실패합니다. $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
설정하고 싶지 않으십니까 ? 바꾸지 마세요. 당신이 원하는 것이 무엇인지 모르니까요.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