2017-04-08 127 views
0

我進入了錯誤的bash shell [: : integer expression expected"以下運行腳本時擊錯誤[:整數表達式預期」

#!/bin/bash 
sm=$(ps -e | grep sendmail > /dev/null 2>&1) 
pm=$(/etc/init.d/postfix status > /dev/null 2>&1) 
check_mail(){ 
if [ "$sm" -eq 0 ]; then 
echo "Service Status: Sendmail is Running!" 
elif [ "$pm" -eq 0 ]; then 
echo "Service Status: Postfix Service is Running!" 
else 
echo "Service Status: Both Sendmail & Postfix Service is Not Running On $(uname -n)" 
fi 
} 
check_mail 

在運行上面的腳本它只是顯示的else 輸出。條件。

Service Status: Both Sendmail & Postfix Service is Not Running On host

雖然,我已經測試 「==」,而 「當量」作爲比較和[[]]但沒有奏效。

+1

你的所有輸出發送到devnull,所以會有沒有在你的增值經銷商。 – 123

+0

@ 123,即使沒有將輸出重定向到發生'integer'錯誤的'/ dev/null 2>&1'。 – krock1516

+0

因爲這些命令都不輸出整數。 – 123

回答

2

我假設您正在嘗試評估進程列表中是否存在sendmail。您應該將代碼改成這樣:

#!/bin/bash 
check_mail(){ 
if 
    ps -e | grep sendmail > /dev/null 2>&1 
then 
    echo "Service Status: Sendmail is Running!" 
elif 
    /etc/init.d/postfix status > /dev/null 2>&1 
then 
    echo "Service Status: Postfix Service is Running!" 
else 
    echo "Service Status: Both Sendmail & Postfix Service is Not Running On $(uname -n)" 
fi 
} 
check_mail 

你原來的代碼失敗的原因在於你捕捉使用命令替換$()命令的輸出。標準輸出,即不是退出代碼。然後,當使用[ -eq ]測試(該測試需要一個整數參數(您的變量不包含該變量))時,它會失敗,並顯示您收到的消息。由於兩個測試總是失敗,因此輸入else子句。

通過將實際命令放入if語句的條件中,您使用的是實際的數值返回碼(0爲true,非零爲false),這正是您想要的。

+0

我之前也嘗試過相同的代碼,但同樣的錯誤。 – krock1516

+0

在我提出的代碼中,你看不到'[::integer expression expected''錯誤,因爲在那個代碼中沒有'[''測試。 – Fred

+0

@Fred .....我的壞..你是對的,但在你的代碼中,我們直接評估'ps -e | grep服務'而不是測試它通過測試條件..我試着同樣的測試'[]'條件和失敗,只是更新了另一個代碼我試過.. – krock1516

2

在我看來,你正在混淆程序的退出狀態和輸出。 var=$(command)會將command的輸出放入var。如123的評論所述,因爲您將所有內容重定向到/dev/null,所以沒有輸出,因此smpm都是空的。

如果你想看到的退出狀態,使用$?

#!/bin/bash 
typeset -i pm 
typeset -i sm 
ps -e | grep sendmail > /dev/null 2>&1 
sm=$? 
/etc/init.d/postfix status > /dev/null 2>&1 
pm=$? 

check_mail(){ 
    if [ $sm -eq 0 ]; then 
     echo "Service Status: Sendmail is Running!" 
    elif [ $pm -eq 0 ]; then 
     echo "Service Status: Postfix Service is Running!" 
    else 
     echo "Service Status: Both Sendmail & Postfix Service is Not Running On $(uname -n)" 
    fi 
} 
check_mail 
+0

@Ljm ....我只是更新了我的帖子,在那裏我應用了測試條件,甚至沒有產生正確的狀態併產生'integer'錯誤。 – krock1516

+0

啊是的,刪除引號。我錯過了那一個。完整的腳本現在在答案中。 Bash排版中的 –

+1

已棄用。 – krock1516