繁体   English   中英

Bash 脚本 if/then 有多个条件

[英]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 你的条件:

  • A 是dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN' dig @8.8.8.8 -t A "$hstnm" | grep -q 'NXDOMAIN'
  • B 是dig @8.8.8.8 -t A "$hstnm" | grep -q 'SERVFAIL' 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 好的,您要实现的是“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 到

  • 挖掘谷歌的主机地址,并检查是否有“没有这样的域”的答案。
  • 当该检查不成功时(双管),在谷歌中挖掘相同的主机地址并检查是否存在“到达域名服务器的问题”答案。
  • 但是,当第一次检查不会失败时,没有其他挖掘(什么还好),但是有些壳会继续进行,而Z20826A3CB51D6C7D9C219C7F4BF4BF4BF4E5C9Z先前的Z78E62221F6393939393D1356681DB3981DB398F14149NY949NON9NY9NY9NY9NY9NONMY9NY9 HODYN9 HODENMENM MONGY CORMENS(IN)依赖这些东西)...什么会导致大失败(因为我们来自静默检查,所以 pipe 中没有输入供第二次检查使用)

所以你明白为什么这里有括号了。 但要注意: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM