如果/然后有多个条件,则Bash脚本



只有当DNS状态为:"NXDOMAIN"或"SERVERFAIL"且具有"CNAME"时,我才想打印出主机名和CNAME。

条件:

dig @8.8.8.8 -t A ${hstnm} | grep -q 'NXDOMAIN'
dig @8.8.8.8 -t A ${hstnm} | grep -q 'SERVFAIL'
dig @8.8.8.8 -t CNAME $hstnm +short >/dev/null

所以我在下面写了bash脚本,但它不起作用,非常感谢任何帮助,谢谢。

for hstnm in $(cat /path/file.txt)
do
if dig @8.8.8.8 -t A ${hstnm} | grep -q 'NXDOMAIN' || dig @8.8.8.8 -t A ${hstnm} | grep -q 'SERVFAIL' && dig @8.8.8.8 -t CNAME $hstnm +short >/dev/null ]]
then
echo -n -e "e[92mNXDOMAIN: e[0m${hstnm} "
echo -n -e "e[93mCNAME: e[0m"; dig @8.8.8.8 -t CNAME $hstnm +short
echo
fi
done

好的,让我们标记您的条件:

  • A是dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN'
  • B是dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL'
  • C为dig @8.8.8.8 -t CNAME "$hstnm" +short >/dev/null

现在,用这些名字,用算法语言告诉我们你想要什么测试
此外,我们需要知道您正在使用的shell(BASh?Korn?Almiquish?Z?(
根据这些参数,我们可能会提供更好的指示。例如

#!/bin/bash
for hstnm in $(cat /path/file.txt)
do
if ( dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN' ) || ( dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL' ) && ( dig @8.8.8.8 -t CNAME "$hstnm" +short >/dev/null )
then
echo -n -e "e[92mNXDOMAIN: e[0m${hstnm} "
echo -n -e "e[93mCNAME: e[0m"; dig @8.8.8.8 -t CNAME "$hstnm" +short
echo
fi
done

假设"A或B然后C"。。。


edit-2020-08-04好吧,你试图实现的是"如果("A"或"B"为真(和("C"为真"THEN">
第一部分"A"one_answers"B"均为真"应翻译为A || B,即

if ( dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN' ) || ( dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL' )
then
#foo
fi

首先,我把"A"one_answers"B"放在括号里。。。或花括号。如果我不这样做,我会以一种有点令人惊讶的方式改变含义:dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN' || dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL'向询问外壳

  • 在谷歌上搜索主机地址,并检查是否有"没有这样的域"的答案
  • 当该检查没有成功时(双管道(,在谷歌上搜索相同的主机地址,并检查是否存在"到达域名服务器的问题"的答案
  • 但是,当第一次检查没有失败时,就没有其他挖掘(这很好(,但一些shell会继续并将以前的输出通过管道发送到grep'命令(我没有检查我的bash的行为,但依赖这样的东西是不好的(。。。什么会导致一个大故障(因为我们来自一个静默检查,所以管道中没有可供第二次检查使用的输入(

所以你明白为什么这里有括号了。但要注意:与bourne兼容的shell不像许多编程语言那样有用于分组逻辑操作的括号。事实上,我们并没有使用布尔切换,而是只使用shell根据上一个命令的成功或失败来调用命令的能力(即使使用test这样的命令,它也不像其他地方看到的那样是真正的虚假系统(尽管有相似之处,在子shell中的圆括号group命令(如果你不想使用子shell并有利于一些上下传递的变量,请使用大括号(当处理组时,它将作为一个整体失败或成功,并具有在组中运行的最后一个命令的返回代码。

现在,我们可以考虑使用分组来实现我们的目标。

if { ( dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN' ) || ( dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL' ) } && ( dig @8.8.8.8 -t CNAME "$hstnm" +short >/dev/null )
then
#foo
fi

坦率地说,我不知道shell是如何支持嵌套分组的,如果不强迫我(你知道,当你继承了一个必须修复的脚本时…(,我永远不会试图找到答案。我宁愿走另一条路:

if ( dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN' ) || ( dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL' )
then 
if dig @8.8.8.8 -t CNAME "$hstnm" +short >/dev/null
then
#foo
fi
fi

要遵循。

这是你的帖子目前所说的(简化(:

if A || B && C ]]
then
...
fi

只需放下尾部的]]

您不需要添加任何分组,因为与许多语言不同,Bash中上下文中的A || B && C等效于(A || B) && C

相关内容

  • 没有找到相关文章

最新更新