GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Skriptfehler:Integer-Ausdruck erwartet?

Ich habe ein ziemlich seltsames Problem, ich führe ein Skript (Bash) auf mehreren Servern aus und es funktioniert auf einem der Server nicht mehr (funktioniert einwandfrei auf allen anderen Servern).

Hier ist der problematische Teil des Skripts:(Ich habe es nicht selbst geschrieben, alle Credits gehen an „Rich“) (http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- und-nrpe/)

    if [ "$result" -lt "$warn_level" ]; then     #Line 56
    echo "Memory OK. $result% used."
    exit 0;
elif [ "$result" -ge "$warn_level" ] && [ "$result" -le "$critical_level" ]; then  #Line 59
    echo "Memory WARNING. $result% used."
    exit 1;
elif [ "$result" -gt "$critical_level" ]; then   #Line 62
    echo "Memory CRITICAL. $result% used."
    exit 2;
fi

Vollständige Fehlermeldung:

./check_memory.sh: Line 56: [: 7.: integer expression expected

./check_memory.sh: Line 59: [: 7.: integer expression expected

./check_memory.sh: Line 62: [: 7.: integer expression expected

Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen und ich werde versuchen, sie so schnell wie möglich zu liefern.

Schätze alle Beiträge 🙂

Akzeptierte Antwort:

Von dem von Ihnen bereitgestellten Link sehe ich die folgende Zeile.

result=$(echo "$used / $total * 100" |bc -l|cut -c -2)

Ändern Sie gemäß dem Kommentar von @Graeme die obige Zeile in unten.

result=$(echo "$used / $total * 100" |bc -l)

Nachdem wir die obige Zeile hinzugefügt haben, müssen wir nun die Ausgabe des result ändern in Ganzzahl wie unten.

result1=${result/.*}

Ich schätze, auf einer der Maschinen, auf der der Fehler auftritt, ist diese Ausgabe keine Ganzzahl. Konvertieren Sie einfach die Ausgabe des Ergebnisses in eine Ganzzahl, damit Sie solche Fälle behandeln können. Fügen Sie die folgende Zeile hinzu, nachdem Sie das result berechnet haben .

result1=${result/.*}

Und statt result Ändern Sie die Variablennamen als result1 innerhalb des if Schleifen, und der Fehler tritt nicht auf.

Ich vermute, der cut -c -2 trägt hauptsächlich zum Fehler bei, da nur die ersten 2 Zeichen abgeschnitten werden. Was ist, wenn das Ergebnis nur ein Zeichen hat? Angenommen, das Ergebnis ist 1.23456 , ergibt der obige Schnitt 1. als Wert für result was offensichtlich die Ursache für integer expected ist Fehler.

Der Grund, warum es auf den verbleibenden Servern gut funktioniert, ist, dass es keinen Fall gab, in dem das result Variable hat nur eine einzige Ziffer. Es ist sehr wahrscheinlich, dass es auch auf den verbleibenden Servern fehlschlägt, wenn das Ergebnis eine einstellige Variable ist (etwas, wie ich es im obigen Beispiel erwähnt habe).

Verwandte:Wie führe ich einen Befehl als Systemadministrator (Root) aus?
Linux
  1. Kann ein Bash-Skript mit einer Datei verknüpft werden?

  2. So teilen Sie eine Zeichenfolge in Bash-Skript auf

  3. 6 Beispiele für bedingte Bash-Ausdrücke ( -e, -eq, -z, !=, [, [[ ..)

  4. Alternativen --config Java-Bash-Skript

  5. Basisname mit Leerzeichen in einem Bash-Skript?

Bash-Sequenzausdruck (Bereich)

35 Bash-Skriptbeispiele

Fehlerbehandlung in Bash-Skripten

Lernen Sie die Bash-Fehlerbehandlung anhand eines Beispiels kennen

So führen Sie ein Bash-Skript aus

Bash-Skript-Musterabgleich