時間が0分から20分の間はベルが鳴らず、20分から40分の間にベルが鳴り、40分から40分の間にベルが鳴るように作成しようとします。 40分後、着信音が2回鳴ります。毎時60分、2つのベルが鳴る間に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
この問題は2つの方法で解決できます。
- 分単位で現在の時間を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以下の場合、チャイムベルが1回鳴ります。私が見るのは大丈夫だと思います。
現在の時間の分が40以上で59以下の場合、チャイムベルが2回鳴り、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
形式は、時間以降の分数をゼロで埋められた2桁の数字にフォーマットします。数字が次から始まり、0
シェルがそれを算術的文脈で使用すると、次のように解釈されます。8進数숫자. 00
범위 내의 숫자 에는 문제가 없지만 유효하지 08
않은 09
8진수입니다.
초기 0을 제거하여( $minute
있는 경우) 이 문제를 해결할 수 있습니다.
minute=${minute#0}
분명히 이 값을 사용하기 전에 이 작업을 수행해야 합니다.
이 문제를 해결하는 또 다른 방법은 생성할 벨 수를 세어 해당 횟수만큼만 울리는 것입니다.
for (( i = 0; i < (minute-1)/20; ++i )); do
[ "$i" -ne 0 ] && sleep 1
echo chime
done
이렇게 하면 초기 차임벨이 울리기 전에 잠을 자지 않아도 되지만 차임벨 사이에 일시 중지가 추가됩니다. 이것은아니요1시간 단위로 시간이 균등하게 배분되지 않는 한 작업은 정상적으로 진행됩니다.