2017-04-08 3 views
0

ich für bash in den Fehler immer [: : integer expression expected" Shell, solange er unterhalb Skript ausgeführtBash Fehler [: Integer-Ausdruck erwartet“

#!/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 

Während das obige Skript ausgeführt wird es einfach ist die Ausgabe von else zeigt. Zustand.

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

Obwohl, ich habe getestet "==" eher "eq" zum Vergleich und [[]] hat aber nicht funktioniert.

+1

Sie alle die Ausgabe senden an devnull, so wird es nichts in Ihrem Vars sein. – 123

+0

@ 123, auch wenn die Ausgabe nicht nach '/ dev/null 2> & 1' umgeleitet wird, was den 'Integer'-Fehler ergibt. – krock1516

+0

Da keiner dieser Befehle eine Ganzzahl ausgibt. – 123

Antwort

2

Ich nehme an, Sie versuchen, das Vorhandensein von Sendmail in der Prozessliste zu bewerten. Sie sollten Ihren Code dies ändern:

#!/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 

Der Grund Ihrer ursprünglichen Code nicht, dass Sie die Ausgabe von Befehlen erfassen Befehl Substitution $(). Die Standardausgabe, dh nicht der Exit-Code. Wenn Sie dann den Test [ -eq ] verwenden, der ein Integer-Argument erwartet (das Ihre Variable nicht enthält), schlägt es mit der Nachricht fehl, die Sie erhalten. Da beide Tests immer fehlschlagen, wird die else Klausel eingegeben.

Indem Sie die tatsächlichen Befehle innerhalb der Bedingungen der if-Anweisung setzen, verwenden Sie den tatsächlichen numerischen Rückkehrcode (0 für True, ungleich Null für false), was Sie hier wollen.

+0

Ich habe den gleichen Code wie vorher versucht, aber der gleiche Fehler. – krock1516

+0

Sie können den Fehler '[:: Integer-Ausdruck erwartet '' in dem von mir vorgeschlagenen Code nicht sehen, da in diesem Code kein' ['-Test vorhanden ist. – Fred

+0

@Fred ..... Meine schlechte .. Sie sind richtig, aber in Ihrem Code bewerten wir direkt die Bedingung von 'ps -e | grep service' und teste es nicht über Testbedingungen .. Ich habe das gleiche mit dem Test '[]' Bedingung versucht und das scheitert, Just aktualisiert den anderen Code, was ich versuchte .. – krock1516

2

Es scheint mir, dass Sie den Ausgangsstatus eines Programms mit der Ausgabe verwechseln. var=$(command) wird die Ausgabe von command in var setzen. Wie in 123s Kommentar gesagt, weil Sie alles an /dev/null umleiten, gibt es keine Ausgabe und daher sind sm und pm leer.

Wenn Sie den Exit-Status sehen möchten, verwenden $?:

#!/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 .... Ich aktualisiere nur meine Post, wo ich die Testbedingung anwendete und sogar seine nicht den richtigen Status liefert und den "Integer" -Fehler auch produziert. – krock1516

+0

Ah ja, entfernen Sie die Anführungszeichen. Das habe ich vermisst. Volles Skript jetzt in der Antwort. –

+1

im Bash-Satz ist veraltet. – krock1516