Ошибка сценария Bash: целое выражение ожидается

Одна вещь, которую я нашел, smbtree как эквивалент для NET VIEW.

13
03.04.2014, 20:12
3 ответа

По приведенной вами ссылке я вижу следующую строку.

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

В соответствии с комментарием @Graeme, измените вышеприведенную строку на следующую.

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

Теперь, после добавления вышеприведенной строки, мы должны изменить вывод результата на целое число, как показано ниже.

result1=${result/.*}

Я предполагаю, что на одной из машин, где возникает ошибка, этот вывод не является целым числом. Просто преобразуйте вывод результата в целое число, чтобы вы могли справиться с такими случаями. Добавьте следующую строку после вычисления результата.

result1=${result/.*}

И вместо result измените имена переменных на result1 внутри циклов if, и ошибка не возникнет.

Я подозреваю, что ошибка возникает из-за cut -c -2, поскольку он вырезает только первые 2 символа. Что если результат содержит только один символ? Допустим, если результат - 1.23456, то вышеупомянутое сокращение приведет к 1. в качестве значения для result, что, очевидно, является причиной ошибки integer expected.

Причина, по которой он работает нормально на остальных серверах, заключается в том, что он не сталкивался со случаем, когда переменная result имеет только одну цифру. Высока вероятность того, что и на остальных серверах произойдет сбой, если результат будет состоять из одной цифры (как я упоминал в примере выше).

5
27.01.2020, 19:53
[1125759]Так что я вообще не знаю, как использовать [1126256]awk[1126257] очень хорошо. Но я знаю, что то, что происходит в скрипте, который вы связали, это много чепухи, и что что-то вроде следующего должно работать. Извините, что не могу это хорошо записать, но так как вы уже вызываете [1126258]awk[1126259] - дважды кажется - вы должны использовать нечто подобное.[1299]
0
27.01.2020, 19:53

Судя по всему, ваша переменная result имеет . в ней после числа, из-за чего bash не распознает ее как таковую. Вы можете воспроизвести ошибку, просто сделав:

[ 7. -gt 1 ]

Если вы добавите больше скрипта к вашему вопросу,| я смогу предположить, откуда это может исходить.

Обновление

Глядя на полный скрипт, я бы просто заменил строку:

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

на:

result=$(( 100 * used / total ))

Поскольку used и total - целые числа, а bash выполняет целочисленную арифметику, обратите внимание на сдвиг умножения на 100 в начало. Или, если вы хотите обеспечить правильное округление ("целочисленное деление" в вычислениях всегда эффективно округляется вниз):

result=$( printf '%.0f' $(echo "$used / $total * 100" | bc -l) )

Это обеспечит отсутствие завершающих точек в result. Подход с использованием cut - не очень хорошая идея, поскольку он применим только для результата в диапазоне 10-99. Он будет неудачен для result от 0-9 (как в вашем случае), а также для чисел выше 99.

Обновление 2

Из комментария @Stephane ниже следует, что при сравнении с пороговыми значениями лучше округлять в меньшую сторону. Учитывая это, есть еще одна небольшая ошибка в фрагменте вопроса - обратите внимание на несоответствие между сравнениями, используемыми для warn_level и critical_level. Сравнения для warn_level корректны, но для critical_level используется -le (меньше или равно) вместо -lt (просто меньше). Рассмотрим случай, когда результат немного больше, чем критический_уровень - он будет округлен вниз до критического_уровня и не вызовет критического предупреждения, хотя должен (и вызвал бы, если бы использовалось сравнение -lt).

Возможно, это не так важно, но вот исправленный код:

if [ "$result" -lt "$warn_level" ]; then
  echo "Memory OK. $result% used."
  exit 0;
elif [ "$result" -lt "$critical_level" ]; then
  echo "Memory WARNING. $result% used."
  exit 1;
else
  echo "Memory CRITICAL. $result% used."
  exit 2;
fi

Тесты -ge также являются избыточными, поскольку эти случаи подразумеваются при достижении elif/else, поэтому они были удалены.

6
27.01.2020, 19:53

Теги

Похожие вопросы