Унарный оператор ожидается

#!/bin/bash

SUBJECT="WARNING CPU USAGE HIGH"
TO=gmail id
MESSAGE=/tmp/messages
echo "#######################" > $MESSAGE
echo "CPU statistics as follows.." >> $MESSAGE
mpstat >> $MESSAGE
echo "#######################" >> $MESSAGE
CPU_USAGE=$(top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1)
[ $CPU_USAGE -gt 85 ] && mail -s "$SUBJECT" "$TO" < $MESSAGE`

./cpu.sh: line 11: [: -gt: unary operator expected Какова могла бы быть причина

6
задан 13 October 2016 в 22:16

2 ответа

Проблема

проблема состоит в том, что CPU_USAGE заканчивается как пустая строка. Это вызывает проблему здесь:

[ $CPU_USAGE -gt 85 ] 

После того, как переменная оболочки оценена, вышеупомянутое становится:

[ -gt 85 ] 

Это перестало работать, потому что аргумент перед эти -gt теперь отсутствует.

решение

получить непустое CPU_USAGE, мы должны заменить:

CPU_USAGE=$(top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1)

с:

CPU_USAGE=$(top -b -n1 | awk '/^%Cpu/ {print $2}' | cut -d. -f1)

, где % был добавлен.

Заключение в кавычки

, Как упомянуто выше, когда CPU_USAGE является пустым и неупомянутым, мы получаем ошибку "Унарного оператора":

$ CPU_USAGE=""; [ $CPU_USAGE -gt 85 ] && echo yes
bash: [: -gt: unary operator expected

Это - лучшая практика для заключения в кавычки переменных оболочки в таких ситуациях. Если мы действительно заключаем его в кавычки, то мы получаем другое сообщение об ошибке:

$ CPU_USAGE=""; [ "$CPU_USAGE" -gt 85 ] && echo yes
bash: [: : integer expression expected

, В то время как мы все еще получаем ошибку, это сообщение об ошибке, по крайней мере, более информативно: это говорит, что $CPU_USAGE не число.

Упрощение

Эти cut процесс не нужен. Мы можем заменить:

CPU_USAGE=$(top -b -n1 | awk '/^%Cpu/ {print $2}' | cut -d. -f1)

с:

CPU_USAGE=$(top -b -n1 | awk -F'[ .]+' '/^%Cpu/ {print $2}')
7
ответ дан 23 November 2019 в 07:28

Ваша строка

top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1

является неправильной. В первую очередь, Вы просите, чтобы AWK нашел строку, запускающуюся с Cpu, когда на самом деле это запускается с %Cpu.

1111-секундный, Вам не нужно cut часть. Можно использовать awk непосредственно:

$ top -b -n1 | awk '/^%Cpu/ {gsub(/\./," ");print $2}'                                             
31
<час>

Для будущего, можно отладить сценарии с set -x наверху сценария после #!/bin/bash строка. Кроме того, используйте https://www.shellcheck.net / , который проверит синтаксис сценария оболочки

4
ответ дан 23 November 2019 в 07:28

Другие вопросы по тегам:

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