Scripting
“如果”聲明違反了他自己的規則,或者我正在這樣做
說明: 我正在使用一個腳本來幫助通知使用者 SSL 證書到期。如果證書有不到 30 天到期,這將通知使用者,如果不是什麼都不做。
但是由於某些奇怪的原因,使用更大的常數進行驗證,甚至電子郵件也在發送,這不應該發生。
這是程式碼:
#!/bin/ksh legend="The next certificate almost expires.\n URL: url.com " count=30 daysleft=$(./ssl-cert-check -d /etc/ssl/certs/cert.cer | awk '{print $6}' | tail -n 1); #daysleft=50 #Constant to do some test sendnot=$(echo $legend | mail -s "url.com SSL cert Expiration" mauricio.dummy@url.com < <(./ssl-cert-check -d /etc/ssl/certs/cert.cer)) if [[ $daysleft -lt $count ]]; then echo "Sending note" echo $sendnot else echo "Doing nothing..." fi
daysleft
用常數做測試,它的工作原理;但即便如此,無論如何都會將筆記發送給使用者。編輯: 輸出:
./ssl-cert-check -d /etc/ssl/certs/cert.cer | awk '{print $6}' | tail -n 1 is 9
任何問題或意見我都會準備好參加。問候!!
這一行:
sendnot=$(echo ... | mail ... < <(./ssl-cert-check ...))
執行命令
echo
,./ssl-cert-check
就在那裡,並擷取整個批次的輸出,即 的輸出sendnot
。這就是為什麼無論if語句如何都會發送電子郵件的原因。另外,如果您只想儲存命令以供進一步使用,請將其設為函式。
send_notice() { local subject=$1 echo "some message" | mail -s "$subject" } ... if whatever...; then send_notice "subject line..." fi
(
$1
將是函式的第一個參數。)此外,該命令還有另一個問題:您同時使用管道和輸入重定向到
所以你的命令實際上等於:
mail -s ... < <(./ssl-cert-check ...)
即
echo
並沒有真正做任何事情。如果要連接兩個命令的輸出,則必須執行以下操作:
(echo "some message"; ./ssl-cert-check ...) | mail ...