
スクリプトにロジックを実装しようとしていますが、期待通りにトリガーされないため、何かを見逃していると思います。
私のアイデアはシンプルです。パイプを使用して同じターミナルで実行されている別のバイナリからのテキストストリームに応答するスクリプトが欲しいのです。出力は次のようになります。
Received 835186
Received 835186
over and over
私はこれらすべてではなく、そのうちの 1 つだけを選択するロジックを作成しようとしていました。
これが私のコードです
#!/bin/bash
TOGGLE="/toggle"
RUN=0
NUM2=1
lights (){
if [ ! -e $TOGGLE ]; then
#below if line i suspect is not triggering but can't see why
if [ $RUN == "0" ]; then
touch $TOGGLE
#/l-off.py
echo "off"
((RUN=RUN+1))
else
rm $TOGGLE
#/l-on.py
echo "on"
((RUN=RUN+1))
fi
fi
# togggle_func
}
timclear (){
while [ $RUN == "1" ];do
sleep 2s
RUN=0
done &
}
togggle_func () {
if [ "$RUN" -ge "$NUM2" ]; then
#RUN=0
timclear
#return
# else
# lights
fi
}
#lines below that i want to control how many times its triggered
while read line; do
if [[ "$line" == "Received 835186" ]] || [[ "$line" == "Received 818562" ]]; then
#togggle_func
lights
dt=$(date '+%r %d/%m/%Y')
echo "Light Switch Pressed at $dt"
echo "run $RUN"
echo "num $NUM2"
fi
done
私の質問はまだ関連していますが、現時点ではCLIからこのように実行するときに、このスクリプトでパイプ自体を実行するにはどうすればよいかということです。/RFSniffer | /Rf_Test2.sh
前もって感謝します
答え1
いかがでしょうか:
#!/bin/bash
TOGGLE="/toggle"
RUN=0
NUM2=1
RFSNIFFERCMD="/RFSNIFFER"
lights (){
if [ ! -e $TOGGLE ]; then
#below if line i suspect is not triggering but can't see why
if [ $RUN == "0" ]; then
touch $TOGGLE
#/l-off.py
echo "off"
((RUN=RUN+1))
else
rm $TOGGLE
#/l-on.py
echo "on"
((RUN=RUN+1))
fi
fi
# togggle_func
}
timclear (){
while [ $RUN == "1" ];do
sleep 2s
RUN=0
done &
}
togggle_func () {
if [ "$RUN" -ge "$NUM2" ]; then
#RUN=0
timclear
#return
# else
# lights
fi
}
#lines below that i want to control how many times its triggered
$RFSNIFFERCMD | while read line
do
if [[ "$line" == "Received 835186" ]] || [[ "$line" == "Received 818562" ]]; then
#togggle_func
lights
dt=$(date '+%r %d/%m/%Y')
echo "Light Switch Pressed at $dt"
echo "run $RUN"
echo "num $NUM2"
fi
done
重要な点は、情報が入力されているテキストの最後から 11 行目の while ループへの変更です。
このスクリプトをさらに批判すると、/toggle ファイルの作成と削除に依存しているように見えます。これは状態を追跡する方法としては最悪で、変数を使用した方が効率的かもしれません。少なくとも、TOGGLE ファイルにファイル拡張子があり、RAMDISK (Ubuntu では /dev/shm など) に書き込み/読み取りが行われることを確認してください。
答え2
これはコメントとして投稿するには難しすぎるのですが、試してみました。以下の私のはるかに単純なスクリプトが、あなたがやろうとしていることに適合するでしょうか (そしてデバッグが簡単でしょうか)。複雑なループではなく、デバウンスを処理するために秒単位で時間を追跡するだけです。
#! /bin/bash
RFSNIFFERCMD="/RFSNIFFER"
DEBOUNCE=5
OLDTIME=$((`date +%s`-$DEBOUNCE))
TOGGLEFILE=/dev/shm/toggle.file
$RFSNIFFERCMD | while read line
do
if [ "$line." == "Received 835186." ] || [ "$line." == "Received 818562." ]
then
NOW=`date +%s`
if [ $(($NOW - $OLDTIME)) -lt $DEBOUNCE ]
then
echo "Ignoring change at $NOW / $OLDTIME"
elif [ -e $TOGGLEFILE ]
then
OLDTIME=$NOW
rm $TOGGLEFILE
echo "Turn On"
else
OLDTIME=$NOW
touch $TOGGLEFILE
echo "Turn Off"
fi
fi
done