[英]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.