L'errore è dovuto a uno degli argomenti per -genon essere numerico. Poiché $ALERTè sempre numerico, $usepdeve essere il colpevole. Esistono diversi problemi con il modo in cui analizzi l'output il dhcui risultato $usepnon è numerico.
A seconda della lunghezza dei filesystem, dhpuò dividere il suo output su più righe. Le linee parziali verranno catturate nel filtro e genereranno dati senza senso. Per evitare questo comportamento e ottenere risultati analizzabili dh, passare l' -Popzione.
dfStampa anche una riga di intestazione che si tradurrà nuovamente in dati privi di senso.
Il tuo filtro è piuttosto complesso. Vorrei usare un singolo passaggio di awk. Del resto, potresti fare il filtro sulla percentuale all'interno di awk (ma non l'ho fatto nel seguente script).
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==1corrisponde alla prima riga, quindi NR==1 {next}salta la prima riga. Le prossime righe escludono alcuni filesystem (nota che la tua descrizione dice che sei interessato abc:/xyz/pqr, ma il tuo codice lo esclude). L'ultima riga awk rimuove la %dalla colonna percentuale prima di stamparla.
Sarebbe più bello inviare una sola mail su tutti i filesystem. Questa volta sto facendo tutte le analisi in 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