Помилка пов'язана з одним із аргументів того, що вона -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 видаляє %з відсоткового стовпця перед його друком.
Було б приємніше надсилати одну пошту про всі файлові системи. Цього разу я роблю весь аналіз дивним чином.
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