如果语句确保字符串在多个文件中不存在

如果语句确保字符串在多个文件中不存在

我一直对做一些本来应该相当简单的事情感到非常残酷。

在过去的几个小时里,我尝试了所有我能想到的方法,但就是无法让它工作。最近的尝试在这里

有没有人有什么建议?

if [[ $(grep -q 10.212.5.5 /etc/dhcp/dhcpd.conf) == 0 ]] && [[ $(grep -q 10.212.5.15} /etc/dhcp/dhcpd.conf) == 0  ]] && [[ $(grep -q 10.212.5.5 file1) == 0 ]] && [[ $(grep -q 10.212.5.5 file2) == 0 ]] ; then echo "notfound" ; fi

答案1

命令(例如grep)通常返回两种不同的结果:输出(操作期间打印的内容)和退出状态(最好将其视为成功与失败)。正如 chicks 指出的那样,shell 的$(somecommand)构造捕获了命令的输出,不是它的退出状态;但grep-q选项阻止它产生输出,因此$( )最终捕获没有什么

我发现有两种简单的方法可以解决这个问题(前提是我理解你要做什么)。第一种方法是使用grep -c而不是-q,这样它会输出找到的匹配数,你可以用 捕获该匹配数并将其$( )与 0 进行比较,就像你正在做的那样(虽然我为了便于阅读而换行了):

if [[ $(grep -c 10.212.5.5 /etc/dhcp/dhcpd.conf) == 0 ]] &&
   [[ $(grep -c 10.212.5.15 /etc/dhcp/dhcpd.conf) == 0  ]] &&
   [[ $(grep -c 10.212.5.5 file1) == 0 ]] &&
   [[ $(grep -c 10.212.5.5 file2) == 0 ]] ; then
       echo "notfound"
fi

另一个选项是使用grep -q,但查看其退出状态。检查命令的退出状态if很简单 - 只需使用命令本身作为测试条件即可。但在这种情况下,它是倒退的,因为grep如果找到模式,则返回成功,如果没有找到,则返回失败;如果发现模式,则您希望测试成功不是发现,因此使用!来扭转状态:

if ! grep -q 10.212.5.5 /etc/dhcp/dhcpd.conf &&
   ! grep -q 10.212.5.15 /etc/dhcp/dhcpd.conf &&
   ! grep -q 10.212.5.5 file1 &&
   ! grep -q 10.212.5.5 file2 ; then
       echo "notfound"
fi

相关内容