GNU/Linux >> Znalost Linux >  >> Linux

Chyba skriptu Bash:Očekává se celočíselný výraz?

Mám docela zvláštní problém, spouštím skript (Bash) na více serverech a na jednom ze serverů přestal fungovat (na všech ostatních serverech funguje naprosto dobře).

Zde je problémová část skriptu:(Nepsal jsem to sám, všechny titulky patří „Rich“) (http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- and-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

Kompletní chybová zpráva:

./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

Pokud potřebujete další informace, dejte mi vědět a pokusím se je dodat co nejrychleji.

Oceňuji všechny příspěvky 🙂

Přijatá odpověď:

Z vámi poskytnutého odkazu vidím níže uvedený řádek.

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

Podle komentáře @Graeme změňte výše uvedený řádek na níže.

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

Nyní, po přidání výše uvedeného řádku, musíme změnit výstup result na celé číslo, jak je uvedeno níže.

result1=${result/.*}

Myslím, že na jednom ze strojů, kde se chyba vyskytuje, tento výstup není celé číslo. Stačí převést výstup výsledku na celé číslo, abyste takové případy zvládli. Po výpočtu result přidejte řádek níže .

result1=${result/.*}

A místo result změňte názvy proměnných na result1 uvnitř if smyčky a k chybě nedojde.

Mám podezření, že cut -c -2 připisuje chybu většinou, protože ořezává pouze první 2 znaky. Co když má výsledek jen jeden znak? Předpokládejme, že výsledek je 1.23456 , výsledkem výše uvedeného střihu bude 1. jako hodnotu pro result což je zjevně příčinou integer expected chyba.

Důvod, proč na zbývajících serverech funguje dobře, je ten, že nenarazil na případ, kdy by result proměnná má pouze jednu číslici. Je vysoce pravděpodobné, že selže i na zbývajících serverech, pokud je výsledkem jednociferná proměnná (něco jako jsem zmínil ve výše uvedeném příkladu).

Související:Jak spustit příkaz jako správce systému (root)?
Linux
  1. Jak ladit Bash skript?

  2. Bash skript k vyplnění šablony?

  3. Jak rozdělit řetězec ve skriptu Bash

  1. Bash Script - příklad Hello World

  2. 6 Bashových příkladů podmíněných výrazů ( -e, -eq, -z, !=, [, [[ ..)

  3. Spusťte bash skript z adresy URL

  1. alternativy --config java bash skript

  2. Spusťte bash skript jako démona

  3. Spusťte příkaz bash na jenkins pipeline