用于在终端输出中搜索特定单词的Bash脚本

问题描述 投票:0回答:2

我正在尝试实现一个bash脚本,该脚本应该在Python脚本终端输出中搜索一个单词。

Python脚本不会停止,因此需要命令末尾的“&”,但“if [$?== 0]; then”条件不起作用。

如何解决?

谢谢,加尔。

#!/bin/bash

#Check if Pixhawk is connected
PORT=/dev/ttyPixhawk

end=$((SECONDS+3))

not_exists=f
/usr/local/bin/mavproxy.py --daemon --non-interactive --master=$PORT | grep 'Failed' &> /dev/null &

while [ $SECONDS -lt $end ] ; do
    if [ $? == 0 ] ; then
       not_exists=t
    fi
    sleep 1
done

if [ $not_exists=t ] ; then
    echo "Not Exists"
else
    echo "Exists"
fi

kill $(pgrep -f '/usr/local/bin/mavproxy.py')
bash shell
2个回答
0
投票

您正在使用grep检查循环中$?命令输出的状态。如果$?是grep之后要触发的下一个命令,并且grep不是后组进程,则可以执行此操作。但是在你的脚本中,$?将返回while [$SECONDS -lt $end ]的状态。您可以尝试将输出重定向到临时文件并检查其状态

/usr/local/bin/mavproxy.py --daemon --non-interactive --master=$PORT | grep 'Failed' &> tmp.txt &
sleep 3

# If file exists and it's size is greater than 0, [ -s File] will return true
if [ -s tmp.txt ]; then 
   echo 'pattern exists'
else
   echo 'pattern not exists'
fi

1
投票

Bash对后台命令的输出一无所知。用[ 5444 -lt 3 ] & echo $?检查自己。

你的if语句在任何情况下都不会起作用,因为$?检查最近一个上一个命令的返回值,在这种情况下是你的while循环。

你有几个不同的选择。如果你正在等待一些输出,并且你知道它在输出中有多长,直到你正在寻找的任何目标发生,你可以让python写入一个文件并继续检查文件大小和失败超时。

您还可以继续使用简单的定时方法,只需几秒钟后检查输出,然后根据该方法确定成功或失败。

您可以使您的python脚本实际结束,或提供更多错误消息,或只写相关部分以这种方式存档。

此外,你真的应该通过shellcheck.net运行你的脚本来发现更多的问题。

您需要更清楚地定义您的目标和用例以获得真正的帮助;我们真正可以说的是“你的方法不会起作用,但肯定会有一些方法可行”

© www.soinside.com 2019 - 2024. All rights reserved.