Linux

Bash 腳本或問題

  • December 28, 2015

我有以下腳本,基本上我想要它做的是連接到各種伺服器。查看有多少打開的文件,如果超過 50,000 則發送電子郵件。但是我需要檢查的最後一台伺服器超過 400,000。我的 OR 有問題,它不起作用。

如果我按原樣執行這個目前腳本,即使沒有達到任何限制,我也會收到警報電子郵件。請幫助我完成我的 OR 聲明。

我在命令行中的輸出顯示:

Alert Server Issue 
AlertError S1:6326 S2:6355 S3:6242 S4:7171 S5:4694 S6:5284 S7:3973 S8:308432

劇本:

#!/bin/bash
S1_IP=72.15.97.13
S2_IP=72.15.97.14
S3_IP=72.15.97.15
S4_IP=72.15.97.16
S5_IP=72.15.97.17
S6_IP=72.15.97.18
S7_IP=72.15.97.19
S8_IP=72.15.97.20

RESULT1=$(ssh test@$S1_IP lsof | wc -l)
RESULT2=$(ssh test@$S2_IP lsof | wc -l)
RESULT3=$(ssh test@$S3_IP lsof | wc -l)
RESULT4=$(ssh test@$S4_IP lsof | wc -l)
RESULT5=$(ssh test@$S5_IP lsof | wc -l)
RESULT6=$(ssh test@$S6_IP lsof | wc -l)
RESULT7=$(ssh test@$S7_IP lsof | wc -l)
RESULT8=$(ssh test@$S8_IP lsof | wc -l)

ERROR_COUNT=0

if [[ $RESULT1 || $RESULT2 || $RESULT3 || $RESULT4 || $RESULT5 || $RESULT6 || $RESULT7 -gt 50000 ]] || [[ $RESULT8 -gt 400000 ]]
then

   ERRORS[$ERROR_COUNT]="AlertError"
   ERROR_COUNT=$(($ERROR_COUNT+1))
fi
if [ $ERROR_COUNT -gt 0 ]
then
   EMAIL=test@reportserver123.com
   SUBJECT="Over 50,000"
   BODY='Alert Server Issue'
   CNT=0
   while [ "$CNT" != "$ERROR_COUNT" ]
   do
       BODY="$BODY ${ERRORS[$CNT]}
S1:$RESULT1
S2:$RESULT2
S3:$RESULT3
S4:$RESULT4
S5:$RESULT5
S6:$RESULT6
S7:$RESULT7
S8:$RESULT8"
       CNT=$(($CNT+1))
   done
   echo $SUBJECT
   echo $BODY
   echo $BODY | mail -s "$SUBJECT" -a "From: report@reportserver123.com" $EMAIL
else
   echo "I can handle it
S1:$RESULT1
S2:$RESULT2
S3:$RESULT3
S4:$RESULT4
S5:$RESULT5
S6:$RESULT6
S7:$RESULT7
S8:$RESULT8"
fi

來自info coreutils ‘測試呼叫’

If EXPRESSION is a single argument, 'test' returns false if the
argument is null and true otherwise

因此,在您的程式碼中包含以下內容的計算結果為true

if [[ $RESULT1 || ...

您想為所有參數顯式指定*$RESULT1 -gt 50000*而不僅僅是最後一個參數。

我向nkms脫帽致敬,我會建議以下內容:

#!/bin/bash

RESULT[1]=2
RESULT[2]=4
RESULT[3]=8
RESULT[4]=16
RESULT[5]=99999
RESULT[6]=32
RESULT[7]=64
RESULT[8]=128
RESULT[9]=256

for result in ${RESULT[*]}
do
   if [[ $result -gt 50000 ]]; then
       echo big result $result
   fi
done

一遍又一遍地重複-gt 50000很容易出錯。即使你做對了,當有人出現並試圖添加另一個結果時會發生什麼?循環更容易維護和擴展。如果您要遍歷每個結果,為什麼不將它們放入一個數組中呢?

如果您想將此擴展到腳本的其餘部分,您也可以將您的 IP 地址放入一個數組中。

引用自:https://serverfault.com/questions/742836