"grep -q" vs "if [ -n/-z]"

use*_*050 3 shell grep shell-script posix

嗨,我有一个适用于 dmenu 的 NetworkManager 的小包装脚本,我希望它尽可能简单,并希望完全 posix。

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

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

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

ilk*_*chu 10

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

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

if echo "$var" | grep -qe "$pattern"; then
    echo match
fi
Run Code Online (Sandbox Code Playgroud)

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

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

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


Siv*_*iva 6

根据维基

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

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