Bash는 구문 오류가 아닌 내가 원하는 것을 수행합니다.

Bash는 구문 오류가 아닌 내가 원하는 것을 수행합니다.

내 스크립트에 논리를 구현하려고 하는데 제대로 실행되지 않아서 뭔가 놓친 것 같습니다.

내 생각은 간단합니다. 스크립트가 파이프를 사용하여 동일한 터미널에서 실행되는 다른 바이너리의 텍스트 스트림에 응답하기를 원합니다. 출력은 다음과 같습니다

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

관련 정보