GNU/Linux >> Tutoriels Linux >  >> Linux

Erreur de script bash :expression entière attendue ?

J'ai un problème plutôt bizarre, j'exécute un script (Bash) sur plusieurs serveurs et il a cessé de fonctionner sur l'un des serveurs (fonctionne parfaitement sur tous les autres serveurs).

Voici la partie problématique du script :(Je ne l'ai pas écrit moi-même, tous les crédits vont à "Rich") (http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- et-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

Message d'erreur complet :

./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 vous avez besoin de plus d'informations, faites-le moi savoir et j'essaierai de vous les fournir le plus rapidement possible.

Appréciez toutes les entrées 🙂

Réponse acceptée :

À partir du lien que vous avez fourni, je vois la ligne ci-dessous.

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

Selon le commentaire de @ Graeme, remplacez la ligne ci-dessus par ci-dessous.

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

Maintenant, après avoir ajouté la ligne ci-dessus, nous devons modifier la sortie du result en entier comme ci-dessous.

result1=${result/.*}

Je suppose que dans l'une des machines où l'erreur se produit, cette sortie n'est pas un entier. Convertissez simplement la sortie du résultat en entier afin de pouvoir gérer de tels cas. Ajoutez la ligne ci-dessous après avoir calculé le result .

result1=${result/.*}

Et au lieu de result changer les noms de variables en tant que result1 à l'intérieur du if boucles, et l'erreur ne se produira pas.

Je soupçonne que le cut -c -2 attribue à l'erreur principalement car il ne coupe que les 2 premiers caractères. Et si le résultat n'a qu'un seul caractère ? Supposons que le résultat soit 1.23456 , la coupe ci-dessus donnera 1. comme valeur pour result qui est évidemment la cause de l'integer expected erreur.

La raison pour laquelle il fonctionne correctement sur les serveurs restants est qu'il n'a pas rencontré de cas où le result variable n'a qu'un seul chiffre. Il est fort probable qu'il échoue également sur les serveurs restants si le résultat est une variable à un chiffre (quelque chose comme je l'ai mentionné dans l'exemple ci-dessus).

En relation :Comment exécuter une commande en tant qu'administrateur système (root) ?
Linux
  1. Gestion des erreurs dans les scripts Bash

  2. Un script Bash peut-il être accroché à un fichier ?

  3. Typeset -a donne une erreur dans le script ?

  4. Script Bash pour remplir un modèle ?

  5. Comment diviser une chaîne dans un script bash

Expression de séquence bash (plage)

35 exemples de scripts bash

Apprendre la gestion des erreurs Bash par exemple

Comment exécuter un script bash

Comment déboguer un script bash ?

nom de base avec des espaces dans un script bash ?