BASH |如果命令等于某件事,如果执行某件事,则为其他

BASH |如果命令等于某件事,如果执行某件事,则为其他,bash,if-statement,case,Bash,If Statement,Case,我正在尝试创建一个BASH脚本,它将在后台持续运行。这个bash脚本应该请求命令rpi cecd的结果,如果它包含45:00,则执行某些操作,如果它包含45:03,则执行其他操作。但目前,如果我要求一个以上的结果,我无法让脚本工作 工作代码,但只要求45:00 /home/rpi-cecd/rpi-cecd | grep -q "45:00" && ok 代码我试过了,但根本不起作用 /home/rpi-cecd/rpi-cecd | grep '45' > /dev/

我正在尝试创建一个BASH脚本,它将在后台持续运行。这个bash脚本应该请求命令rpi cecd的结果,如果它包含45:00,则执行某些操作,如果它包含45:03,则执行其他操作。但目前,如果我要求一个以上的结果,我无法让脚本工作

工作代码,但只要求45:00

/home/rpi-cecd/rpi-cecd | grep -q "45:00" && ok

代码我试过了,但根本不起作用

/home/rpi-cecd/rpi-cecd | grep '45' > /dev/null
if [[ $? =~ .*45:00.* ]]
then
    echo "OK Button Clicked - HMS"
    ok
elif [ $? == *"45:03"* ]
then
    echo "Left Button Clicked - Canteen"
    left
else
    echo "Nothing Clicked?"
fi
编辑 我只是试了一下,运气不好

hhmm=$(/home/rpi-cecd/rpi-cecd)
case "$hhmm" in
        45[:]00 )
                ok
                ;;
        45[:]03 )
                left
                ;;
        * )
                 echo "don't know how to process $hhmm"
                ;;
esac

如果
rpi-cecd
连续运行而不退出,则不能只捕获一次其输出。你需要不断地阅读它。您可以通过在读取时将其输出管道化到
循环来实现这一点

/home/rpi-cecd/rpi-cecd | while IFS= read -r line; do
    case $line in
        *45:00*)
            ok
            ;;
        *45:03*)
            left
            ;;
        *)
            echo "don't know how to process $line"
            ;;
    esac
done

在使用答案之前,您可能需要清理答案:

payload=
while read line;do
    [ "$line" ] && [ -z "${line//*payload=*}" ] && payload=${line#*payload=[}
  done < <(/home/rpi-cecd/rpi-cecd)

case ${payload%%]*} in
    *45:00 ) 
        echo payload 45oo
        ;;
    *45:03 )
        echo payload 45.3
        ;;
    * )
        echo "other ("${payload%%]*}")..."
        ;;
    esac
有效载荷=
读行时;做
[“$line”]&&&&z“${line//*有效负载=*}”]&&payload=${line#*有效负载=[}”

完成<如@Someprogrammerdude建议的那样,并且至少在if和elif中使用相同的方括号策略(建议在两者中使用双方括号)。是否有效?一个问题是
$?
是最后一个命令的退出代码(成功通常为零,失败为非负数)。它不包含输出结果。如果需要从
grep
命令获取输出,则需要捕获它。
$?
是最近执行的cmd的返回状态。它始终是一个整数,不会包含任何类似
45:00
的内容。这里有很多其他问题,请尝试使用第一个cmd并保存其输出对于变量,ile.
hhmm=$(rpi cecd…
。现在将其与45[:]00)cmd1…;45[:]03)cmd2…;*)echo中的
大小写“$hhmm”进行比较“不知道如何处理$hhmm”;esac
。祝你好运。Sheller,你能详细解释一下我应该如何使用它吗?当我粘贴它并将cmd1更改为echo时,终端在运行代码时没有给出任何响应。
rpi cecd
的正常输出是什么?/这仍然不起作用:/忘了提到,但这个命令就像一个尾巴,它总是在写东西到终端,当我点击电视遥控器上的OK按钮时,它会写入一行包含45:00的代码。(如果这改变了什么)此命令输出“other…”然后结束,当命令运行且按下电视遥控器上的按钮时,rpi cecd尾随并仅写入45:0…的行。好的,您必须读取
rpi cecd
的整个输出以查找有效负载行。