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
我会去看看我的触摸屏是否用自己的脚本校准过。 但我对 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