スクリプトは数時間ビープ音を鳴らします。つまり、10時にスクリプトを実行するとビープ音が10回鳴ります。そして3秒ほど停止した後、分が15~30分なら1回鳴らし、30~45分なら2回鳴らし、45~60分なら2回鳴らさなければなりません。 、ビープ音を3回鳴らさなければならなかった。最初の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
12:00:01
もちろん、あまりにも多くの時間がかかったため、ビープ音が示す時間はスクリプトを起動した時間11:00
ではありません(たとえば、11:59:50に実行するとビープ音が11回鳴ります。)にあると思うようになります 正しい時間にビープ音が鳴るようにスクリプトの始めに と を設定したくない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