方括号中的grep --quiet

时间:2018-02-16 13:02:17

标签: bash grep conditional

请问某人使用grep -q这个行为的原因好吗? 我有一个包含“pippo”字样的文件。

1)
if [[ $(cat file | grep pippo) ]]; then echo OK; else echo KO; fi
--> OK
2)
if cat file | grep -q pippo; then echo OK; else echo KO; fi
--> OK    
3)
if [[ $(cat file | grep -q pippo) ]]; then echo OK; else echo KO; fi
--> KO    

grep:的“-q”选项不会向标准输出写入任何内容。如果发现任何匹配,则立即退出零状态,即使检测到错误也是如此。 为什么第三次返回OK? 谢谢

2 个答案:

答案 0 :(得分:0)

原因是:

if [[ '' ]]; then echo OK; else echo KO; fi
--> KO

第二个按预期工作,因为这是if正在做的事情,而[[...]]它没有说出这个命令是否成功'或者'如果此命令没有以错误退出'

因此[[运算符将评估$(...)的输出,而不是它的返回值。您可以查看

if [[ $(echo boo) == boo ]]; then echo ok; fi
--> ok

但您的grep -q并未输出任何可能被评估的内容。

您可以阅读man bash,特别是Compound commands部分[[解释CONDITIONAL EXPRESSIONS运算符和[[部分,它们将解释{{1}}内的评估内容。

答案 1 :(得分:0)

你得到一个零长度的字符串。

$ a=$(cat file | grep -q "pippo")
$ echo $a

$ if [[ $a ]]; then echo ok; else echo err; fi
err

grep -q通常用于获取grep命令的退出代码,而不是比较字符串。推荐用途是,

$ if grep -q "pippo" file; then echo ok; else err; fi

以上将对grep -q "pippo" file进行真值评估。