
내 스크립트에 논리를 구현하려고 하는데 제대로 실행되지 않아서 뭔가 놓친 것 같습니다.
내 생각은 간단합니다. 스크립트가 파이프를 사용하여 동일한 터미널에서 실행되는 다른 바이너리의 텍스트 스트림에 응답하기를 원합니다. 출력은 다음과 같습니다
Received 835186
Received 835186
over and over
나는 그들 모두가 아닌 이들 중 하나만 선택하는 논리를 만들려고 시도했습니다.
여기 내 코드가 있습니다
#!/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
핵심 비트는 정보가 공급되는 텍스트 하단에서 while 루프 11줄로 변경되는 것입니다.
내가 스크립트를 더 비판한다면, 당신은 생성 및 삭제되는 파일/토글에 의존하는 것으로 보입니다. 이는 상태를 추적하는 끔찍한 방법으로 보이며 변수를 사용하여 더 효율적으로 제공될 수 있습니다. 최소한 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