![如果语句确保字符串在多个文件中不存在](https://linux22.com/image/1522264/%E5%A6%82%E6%9E%9C%E8%AF%AD%E5%8F%A5%E7%A1%AE%E4%BF%9D%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%9C%A8%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E4%B8%8D%E5%AD%98%E5%9C%A8.png)
我一直对做一些本来应该相当简单的事情感到非常残酷。
在过去的几个小时里,我尝试了所有我能想到的方法,但就是无法让它工作。最近的尝试在这里
有没有人有什么建议?
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