簡體   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