测试和记录终端输出

时间:2014-12-09 13:27:20

标签: bash if-statement output conditional-operator

我正在使用以下命令行,以便通过bluetoothctl工具向我的设备控制器发送命令。

#!/bin/sh
{ sleep 1 && echo -e 'power on \n' && sleep 1;} | bluetoothctl

终端返回:

root@snp:~# ./bt.sh 
[NEW] Controller 01:02:03:04:05:C3 snp [default]
[NEW] Device 98:0D:2E:E5:14:81 HTC
Changing power on succeeded
[CHG] Controller 01:02:03:04:05:C3 Powered: yes
[DEL] Controller 01:02:03:04:05:C3 snp [default]

我想减少和管理返回的邮件数量。基本上,我想在屏幕上显示并存储在日志文件中:

Changing power on succeeded
[CHG] Controller 01:02:03:04:05:C3 Powered: yes

我输入

{ sleep 1 && echo -e 'power on \n' && sleep 1;} | bluetoothctl | grep -E "Changing|[CHG]" 2>&1 | tee log.txt

但我得到了,

root@snp:~# ./bt.sh 
[NEW] Controller 01:02:03:04:05:C3 snp [default]
[NEW] Device 01:02:03:04:05:C3 HTC 
Changing power on succeeded
[DEL] Controller 01:02:03:04:05:C3 snp [default]

我的错在哪里?

此外,是否有可能通过条件测试来测试Powered =是或否,并且所有内容都在同一行中进行测试?

--------------------------------

编辑n°1:

实际上,状态消息并未针对标准错误,2& 1是无用的。

然而,我通过以下方式尝试了你的命题:

{ sleep 1 && echo -e 'power on \n' && sleep 1;} | bluetoothctl | grep -E 'Changing|\[CHG]' 
总是返回的

root@snp:~# ./bt.sh 
Changing power on succeeded

而不是

root@snp:~# ./bt.sh 
Changing power on succeeded
[CHG] Controller 01:02:03:04:05:C3 Powered: yes

1 个答案:

答案 0 :(得分:1)

正则表达式[CHG]是一个与CHG中的任何一个匹配的字符类。如果你想在字面上匹配一个开头方括号,你必须逃避它。

grep -E 'Changing|\[CHG]'

此外,您可能想要检查状态消息是否定向到标准错误。如果是这样,请尝试

... | bluetoothctl 2>&1 | grep ...

您拥有的grep 2>&1重定向似乎没有任何用处。