“grep -q”与“if [-n/-z]”

“grep -q”与“if [-n/-z]”

你好,我有一个 NetworkManager 的小包装脚本,它与 dmenu 一起使用,我希望它尽可能简单,并希望完全 posix。

我正在使用 shellcheck,它给了我关于这一行的“警告”:

...
if [ -z "$(echo "$VAR" | grep "pattern")" ] && [ -z "$(grep -w $OtherVar ~/somefile)" ]
...

它(shellcheck)说我应该使用grep -q而不是[ -z ],但在阅读(并重新阅读)bash 和 grep 的手册页后,它似乎grep -q实际上并不是我想要使用的,或者是吗?grep -q实际上与 相比如何[ -z/-n]

答案1

将条件置于[ -z "$(echo "$VAR" | grep "pattern")" ]检查输出是否为grep空。使用grep -qgrep 检查是否匹配任何内容。

如果你想知道是否$var包含正则表达式$pattern,你可以使用

if echo "$var" | grep -qe "$pattern"; then
    echo match
fi

if ! echo ...相反的情况。

这与查看 的输出完全不同grep,因为理论上您可能有一个与零字符字符串匹配的模式...(但它可能会匹配任何输入。)

请注意,那里没有[.. ],我们直接使用该echo | grep管道作为条件。检查退出状态if command命令,可以是[,或另一个命令。

答案2

根据维基百科

[ -z "$( grep -w ..) ]该 grep 将迭代整个文件并将所有匹配的行读入内存,然后再做出决定。

grep -q更干净,并在第一个匹配行处停止,避免迭代目录的其余部分并将数据读入内存。

相关内容