shell,匹配终端输出中的一个字符串

shell, match a string in terminal output

我会去看看我的触摸屏是否用自己的脚本校准过。 但我对 shell 脚本的经验真的很少。我希望有人能帮助我。

我的想法是执行 xinput --list-pros <device> 并使用条目 ...(242): <no items> 检查终端输出。 如果触摸屏未校准,则可以选择此选项,否则有 x/y 坐标,如 ...(242): 1 22 333 4444

在我的脚本中,我将执行 xinput --list-pros <device> 并检查 grep 是否有条目 (242),然后检查同一行是否有条目 <no items>。但是我无法读取 xinput --list.

的输出
# read the terminal output from xinput
$xinput_output= less xinput --list-pros 7

    while read $xinput_output
    do
         # check first line from output
         grep "242" $xinput_output
         if [ $? != 0]
         then
             break;
         else
             # found 242 check x/y coordinates
             grep "<no items>" $xinput_ouput
             if [ $? != 0]
             then
                 #no x/y coordinates, execute xinput_calibration
                 xinput_calibration
                 exit 0
             fi
         fi

    done < 

用反引号或 $() 将您的命令括起来:

var=`some command`  # note no $ before var
# Or by $()
var=$(some command)

# then you can now use command's output
echo $var

大概你的意思是xinput --list-props

无论哪种方式,你都需要在bash中正确执行命令,并且你需要正确分配变量,所以试试这个:

xinput_output=$(xinput --list-props 7)

感谢您的帮助,

我有一个有效的解决方案。 但我会提前一点。我将删除 'touch' 命令并将“./demo”输出写入内存而不是文件。 不要混淆我更改 'xinput' 以在我自己的 skript './demo' 中进行测试,这是一个只有几个 'echo' 命令来生成终端输出的脚本。

    #filename: touch
    #!/bin/bash

            touch /tmp/tmp.log
            ./demo > /tmp/tmp.log

            calibration=$(grep controller /tmp/tmp.log)
        if [ $? != 0 ]
        then
            echo "missing match, corrupt file\n"
            exit 0
        fi

        if [[ $calibration == *"<no items>"* ]]
        then
            echo no calibration
            #xinput_calibration
        else
            echo found x/y coodinates
        fi

        rm /tmp/tmp.log

        exit0

测试脚本:

#filename: demo
#!/bin/bash

echo 'cookie'
echo 'cookie'
echo 'cookie'
controller\:\ \<no\ items\>
echo 'cookie'
echo 'cookie'
echo 'cookie'

exit 0

我 ****找到** 解决方案**。 :D\"/,

我的问题是,

tmp=$(./demo)
echo $tmp

您将 ./demo 的终端输出作为字符串输出。 使用 'grep' 你找不到一行。 因此,您必须键入“${tmp}”才能使用 grep 查找单行。

#cache terminal output
    tmp=$(./demo)
#find word in cache
    match=$(echo "${tmp}" | grep 'controller')
    echo $match