GNU/Linux >> Linux Esercitazione >  >> Linux

Errore script Bash:è prevista un'espressione intera?

Ho un problema piuttosto strano, sto eseguendo uno script (Bash) su più server e ha smesso di funzionare su uno dei server (funziona perfettamente su tutti gli altri server).

Ecco la parte problematica della sceneggiatura:(Non l'ho scritta io stesso, tutti i crediti vanno a "Ricco") (http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- e-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

Messaggio di errore completo:

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

Se hai bisogno di maggiori informazioni, fammi sapere e cercherò di fornirle il più velocemente possibile.

Apprezza tutti gli input 🙂

Risposta accettata:

Dal link che hai fornito, vedo la riga sottostante.

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

Come per il commento di @Graeme, cambia la riga sopra in sotto.

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

Ora, dopo aver aggiunto la riga sopra, dobbiamo cambiare l'output del result per intero come di seguito.

result1=${result/.*}

Immagino che in una delle macchine in cui si verifica l'errore, questo output non è un numero intero. Basta convertire l'output del risultato in intero in modo da poter gestire questi casi. Aggiungi la riga sottostante dopo aver calcolato il result .

result1=${result/.*}

E invece di result cambia i nomi delle variabili come result1 all'interno del if loop e l'errore non si verificherà.

Sospetto, il cut -c -2 attribuisce all'errore principalmente poiché sta tagliando solo i primi 2 caratteri. E se il risultato avesse un solo carattere? Supponiamo che il risultato sia 1.23456 , il taglio sopra risulterà in 1. come valore per result che ovviamente è la causa del integer expected errore.

Il motivo per cui funziona correttamente nei server rimanenti è perché non ha riscontrato un caso in cui il result la variabile ha solo una cifra. È molto probabile che fallisca anche nei server rimanenti se il risultato è una variabile a una cifra (qualcosa come ho menzionato nell'esempio sopra).

Correlati:come eseguire un comando come amministratore di sistema (root)?
Linux
  1. Scopri la gestione degli errori di Bash con l'esempio

  2. Uno script Bash può essere agganciato a un file?

  3. Digitare -a sta dando un errore nello script?

  4. Script Bash per compilare un modello?

  5. 6 Esempi di espressioni condizionali Bash ( -e, -eq, -z, !=, [, [[ ..)

Espressione sequenza Bash (intervallo)

35 Esempi di script Bash

Gestione degli errori negli script Bash

Come eseguire uno script Bash

Esegui lo script bash come demone

Genera errore in uno script Bash