2014-01-23 77 views
3

所有,-bash:[:@:二进制运算符预期

我检查在最后一行文件中的错误信息,我想有一个“是”的结果,如果有一个“错误” 。我的shell脚本如下图所示:

-bash: [: @: binary operator expected 

在最后一行的错误信息是象下面这样::

[aaa,bbb,ccc, Error.ddd @ ] 

[ $(tail -1 error.log | grep -E "Error") ] && echo "yes" 

然后我在标题中得到了错误像上面我认为这是因为[@]格式内容导致此错误的错误消息。但我不知道如何解决它。有没有人知道如何处理这个[@]问题。非常感谢

@csiu,非常感谢您的快速回复。

这里的技巧是使用双“[”,如下:

[[ $(tail -1 error.log | grep -E "Error") ]] && echo "yes" 
+0

'[]'是做一些比较,你只是给一块文本,所以对于bash而言[@]'是不能解释的。 – fedorqui

+0

如何使用双“[”和“]”? '[[$(tail -1 error.log | grep -E“Error”)]] && echo“yes”' – csiu

+0

@fedorqui,我认为grep -E是用于比较。 – zhihong

回答

4

此外,以@ csiu的回答,不需要test命令的。您可以根据的grep的退出状态操作:

tail -1 error.log | grep -qE "Error" && echo yes 

使用-q沉默从grep的输出。它也更高效,因为一旦找到模式,grep就会立即退出。


因为我们只有一个输入线,我们甚至不需要的grep:

[[ $(tail -1 error.log) == *Error* ]] && echo yes 
+1

+1这是更好的答案。 – chepner

+0

事后看来,效率并不相关,因为我们只有一行输入 –

+0

@ glenn,很好,这是我最初的想法,可以隐藏grep的输出。但在这里不知道“-q”选项。非常感谢〜 – zhihong