GNU/Linux >> Tutoriales Linux >  >> Linux

Error de secuencia de comandos Bash:¿Se esperaba una expresión entera?

Tengo un problema bastante extraño, estoy ejecutando un script (Bash) en varios servidores y dejó de funcionar en uno de los servidores (funciona perfectamente bien en todos los demás servidores).

Aquí está la parte problemática del guión:(No lo escribí yo mismo, todos los créditos van a “Rich”) (http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- y-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

Mensaje de error 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

Si necesita más información, hágamelo saber e intentaré proporcionársela lo más rápido posible.

Agradezco todas las entradas 🙂

Respuesta aceptada:

Desde el enlace que proporcionó, veo la siguiente línea.

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

Según el comentario de @Graeme, cambie la línea de arriba a la de abajo.

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

Ahora, después de agregar la línea anterior, tenemos que cambiar la salida del result a entero como se muestra a continuación.

result1=${result/.*}

Supongo que en una de las máquinas donde ocurre el error, esta salida no es un número entero. Simplemente convierta la salida del resultado a un número entero para que pueda manejar tales casos. Agregue la siguiente línea después de calcular el result .

result1=${result/.*}

Y en lugar de result cambie los nombres de las variables como result1 dentro del if bucles, y el error no ocurrirá.

Sospecho que el cut -c -2 se atribuye al error principalmente porque está cortando solo los primeros 2 caracteres. ¿Qué sucede si el resultado tiene un solo carácter? Supongamos que si el resultado es 1.23456 , el corte anterior dará como resultado 1. como valor para result que obviamente es la causa del integer expected error.

La razón por la que funciona bien en los servidores restantes es porque no ha encontrado un caso en el que el result variable tiene un solo dígito. Es muy probable que también falle en los servidores restantes si el resultado es una variable de un solo dígito (algo como lo que mencioné en el ejemplo anterior).

Relacionado:¿Cómo ejecutar un comando como administrador del sistema (raíz)?
Linux
  1. ¿Cómo depurar un script Bash?

  2. Cómo dividir una cadena en Bash Script

  3. Bash Script - Ejemplo de Hola mundo

  4. alternativas --config script java bash

  5. Ejecutar script bash como demonio

Expresión de secuencia Bash (rango)

35 ejemplos de secuencias de comandos Bash

Manejo de errores en scripts Bash

Cómo ejecutar un script Bash

Generar error en un script Bash

Coincidencia de patrón de secuencia de comandos Bash