Ошибка связана с тем, что один из аргументов -geне является числовым. Так $ALERTкак всегда числовой, $usepдолжен быть виновником. Есть несколько проблем, связанных с тем, как вы анализируете выходные данные, dhкоторые $usepне являются числовыми.
В зависимости от длины файловых систем, dhможет разбить свой вывод на несколько строк. Частичные строки будут пойманы в вашем фильтре и приведут к бессмысленным данным. Чтобы избежать такого поведения и получить анализируемый вывод dh, передайте -Pопцию.
Также dfпечатает строку заголовка, которая снова приведет к бессмысленным данным.
Ваш фильтр довольно сложный. Я бы использовал один проход awk. В этом отношении вы можете выполнить фильтрацию по процентам внутри awk (но я не делал этого в следующем скрипте).
df -H | awk '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
if [ "$percentage" -ge "$ALERT" ]; then
mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
fi
done
NR==1соответствует первой строке, поэтому NR==1 {next}пропускает первую строку. Следующие несколько строк исключают некоторые файловые системы (обратите внимание, что ваше описание говорит, что вы заинтересованы abc:/xyz/pqr, но ваш код исключает это). Последняя строка awk удаляет %столбец процента перед печатью.
Было бы лучше отправлять одно сообщение обо всех файловых системах. На этот раз я делаю весь анализ в awk.
message=$(df -h | awk -v ALERT="$ALERT" '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5)}
$5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi