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

Можно использовать одинарные кавычки для предотвращения расширения.

find . -iname 'foo [bar]'
2
21.06.2014, 02:12
4 ответа

bash (в отличие от ksh93 или zsh1) не может делать арифметику с плавающей точкой. Однако awk может, так что вы можете сделать все это в awk.

Также вам не нужно использовать top (и подождать 1 секунду), чтобы получить нагрузку. Канонический способ получения нагрузки - из uptime.

uptime | awk '{load=+$(NF-2)}
  load > 2 {print "CRITICAL: " load; exit 2}
  load > 1 {print "WARNING: " load; exit 1}
  {print "OK: " load; exit 0}
  END {if (!NR) {print "UNKNOWN"; exit 3}'
exit

1 Однако в zsh для сравнения неинтегров

4
27.01.2020, 21:51

top -b -n1 | grep -i load | awk -F, '{print$4}'| awk -F: '{print $2}' возвращает nada, следовательно, ваши ошибки.

2
27.01.2020, 21:51

Ваш loadavg равен нулю, что приводит к синтаксическим ошибкам по [:

$ top -b n1 | grep -i load | awk -F, '{print$4}'| awk -F: '{print $2}'
<blank line here>

Вы должны изменить его на:

$ top -b n1 | grep -i load | awk -F, '{print$4}'| awk -F: '{print $1}'
 0.24

Однако, вы должны использовать более новый тест в вашем скрипте, он может справиться с этой проблемой:

$ [[ "" -gt 1 ]] || echo "OK"
OK

Со старым [:

$ [ "" -gt 1 ] || echo "OK"
bash: [: : integer expression expected
OK

Обновленный

bash не может обрабатывать числа с плавающей точкой, поэтому ваше сравнение (даже с новым тестом [[...]. .]]) будет показывать ошибки.

Для этого можно использовать другие инструменты, например bc, awk. ...

Пример:

$ [[ $(echo "3 > 1" | bc -l) == 1 ]] && echo OK
OK
$[[ $(echo "3 < 1" | bc -l) == 1 ]] || echo Not OK
Not OK
2
27.01.2020, 21:51

Во-первых, запуск вершины дороже, чем просто получение «времени безотказной работы».

$ uptime
 16:15:38 up 6 days, 23:22, 23 users,  load average: 0.99, 0.82, 0.70

Во-вторых, как заметил @ Stéphane Chazelas, bash не любит арифметику с плавающей запятой.

$ [[ "0.1" -lt 1 ]] 
bash: [[: 0.1: syntax error: invalid arithmetic operator (error token is ".1")

К счастью, расширение bash может об этом позаботиться. Из man bash :

  $ {параметр% word}
  $ {параметр %% word}
  Удалите соответствующий шаблон суффикса.  Слово расширяется для создания шаблона так же, как при раскрытии имени пути.  Если
  шаблон соответствует конечной части расширенного значения параметра, тогда результатом раскрытия будет
  расширенное значение параметра с самым коротким совпадающим шаблоном (случай ``% '') или самым длинным совпадением
  шаблон (регистр `` %% '') удален.  Если параметр равен @ или *, операция удаления шаблона применяется к каждому
  позиционный параметр, в свою очередь, и раскрытие представляет собой результирующий список.  Если параметр является переменной массива sub-
  сценарий с @ или *, операция удаления шаблона применяется к каждому члену массива по очереди, а
  расширение - это результирующий список.
 

Таким образом, становится довольно легко вырезать десятичные части с помощью «%. *»

$ la=`uptime | sed 's/.*average: \([0-9\.]*\).*/\1/'`
$ if [ ${la%.*} -lt 1 ]; then echo "OK - Load average is $la"; fi
OK - Load average is 0.42
0
27.01.2020, 21:51

Теги

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