[英]Bash script if/then with multiple conditions
仅当 DNS 状态为:“NXDOMAIN”或“SERVFAIL”并且具有“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
好的,让我们 label 你的条件:
dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN'
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 A "$hstnm" | grep -q 'SERVFAIL'
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 好的,您要实现的是“IF(“A”或“B”为真)和(“C”为真)THEN”
第一部分,““A”或“B”为真”应翻译为A || 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”和“B”放在括号中……或大括号中。 如果我不这样做,我会以一种有点令人惊讶的方式改变含义: 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 A "$hstnm" | grep -q 'NXDOMAIN' || dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL'
dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN' || dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL'
询问 shell 到
所以你明白为什么这里有括号了。 但要注意:bourne 兼容的 shell 没有括号来像许多编程语言那样对逻辑操作进行分组。 事实上,我们没有使用 boolean 切换,而只是 shell 根据前一个命令的成功或失败调用命令的能力(它不是像其他地方看到的真假系统,即使使用像test
这样的命令也是如此)尽管相似,但子shell中的括号组命令(如果您不想使用子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 如何支持嵌套分组,如果我不是被迫的,我永远不会试图找到答案(你知道,当你继承一个你必须修复的脚本时......)我觉得很难回读并因此保持。 我更喜欢 go 以其他方式:
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
只需删除尾随]]
。
您不需要添加任何分组,因为与许多语言不同, A || B && C
A || B && C
在此上下文中 Bash 等效于(A || B) && C
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.