你好,我有一个 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 -q
grep 检查是否匹配任何内容。
如果你想知道是否$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
更干净,并在第一个匹配行处停止,避免迭代目录的其余部分并将数据读入内存。