【问题标题】:BASH | If command equals something, else if do something重击 |如果命令等于某事,否则如果做某事
【发布时间】:2016-12-08 14:11:29
【问题描述】:

我正在尝试创建一个在后台持续运行的 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

【问题讨论】:

  • 正如@Someprogrammerdude 建议的那样,至少在 if 和 elif 中使用相同的方括号策略(建议在两者中使用双方括号)。有用吗?
  • 一个问题是$? 是最后一个命令的退出代码(通常为零表示成功,非负数表示失败)。它不包含输出的结果。如果您需要 grep 命令的输出,您需要捕获它。
  • $? 是最近执行的cmd的返回状态。它始终是一个整数,它不会包含像45:00 这样的任何东西。这里还有很多其他问题但是尝试您的第一个 cmd 并将其输出保存到 var, ile。 hhmm=$(rpi-cecd... ) 。现在将其与case "$hhmm" in 45[:]00 ) cmd1 ... ; 45[:]03 ) cmd2 ... ;; * ) echo "don't know how to process $hhmm" ;; esac 进行比较。祝你好运。
  • Shellter,你能解释一下我应该如何使用它吗?当我把它粘贴进去并将cmd1更改为echo时,终端在运行代码时没有任何响应?
  • rpi-cecd的正常输出是多少

标签: bash if-statement case


【解决方案1】:

如果rpi-cecd 连续运行而不退出,你不能只捕获它的输出一次。你需要不断地阅读它。您可以通过将其输出传递到 while read 循环来做到这一点。

/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

【讨论】:

  • 这仍然不起作用:/ 忘了提,但是这个命令就像一个尾巴,它总是在向终端写东西,当我点击电视遥控器上的 OK 按钮时,它写了一行包含 45:00 的代码。 (如果这改变了什么)
【解决方案2】:

您可能需要在使用它们之前清理您的答案:

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

【讨论】:

  • 此命令输出 'other...' 然后完成,rpi-cecd 被拖尾并且仅在命令运行并按下按钮时写入 45:0... 的行电视遥控器。
  • 好的,你必须阅读rpi-cecd的整个输出才能找到payload行。
猜你喜欢
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多