Błąd wynika z tego, że jeden z argumentów -ge
nie jest liczbowy. Ponieważ $ALERT
zawsze jest to liczba, $usep
winowajcą musi być. Istnieje kilka problemów ze sposobem analizowania danych wyjściowych, dh
które powodują, $usep
że nie są numeryczne.
W zależności od długości systemów plików dh
może podzielić dane wyjściowe na kilka wierszy. Częściowe linie zostaną przechwycone w filtrze i spowodują nonsensowne dane. Aby uniknąć tego zachowania i uzyskać analizowalne dane wyjściowe dh
, należy przekazać tę -P
opcję.
Również df
drukuje wiersz nagłówka, który ponownie spowoduje nonsensowny danych.
Twój filtr jest dość złożony. Użyłbym jednego przejścia awk. W tym przypadku możesz wykonać filtrowanie procentowe w awk (ale nie zrobiłem tego w poniższym skrypcie).
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
dopasowuje pierwszą linię, więc NR==1 {next}
pomija pierwszą linię. Następne kilka wierszy wyklucza niektóre systemy plików (zauważ, że twój opis mówi, że jesteś zainteresowany abc:/xyz/pqr
, ale kod go wyklucza). Ostatni wiersz awk usuwa %
kolumnę procentową przed wydrukowaniem.
Przyjemniej byłoby wysłać jedną wiadomość o wszystkich systemach plików. Tym razem wykonuję całą analizę w 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