#!/bin/bash
LIMIT='50'
DIR="( $(df -Ph | column -t | awk '{print $5}' | grep -v Use) )"
for i in $DIR;
do
USED=$(df -Ph $i | awk '{print $5}' | sed -ne 2p | cut -d"%" -f1)
if [ "$USED" -gt "$LIMIT" ];
#If used space is bigger than LIMIT
then
#####
fi
done
为什么我在第5行出现语法错误?在变量$DIR的for循环中?
我认为根本错误是数组赋值中的引号。您需要去掉引号并使用DIR=( $(...) )
,而不是DIR="( $(...) )"
。然而,这项任务根本没有必要!
您可能不应该这样解析df
,但绝对不应该多次运行df
。不需要嵌入式循环。由于在文件系统使用超过限制的情况下,您并没有真正应该做您正在做的事情,因此很难给出更好的代码,但无论您在那里做什么,几乎可以肯定地在awk中都可以轻松完成。或者,如果不在awk中,可以使用awk
而不是嵌入式循环来触发操作。例如,你可以做:
df -Ph | awk 'NR>1{printf("%s: %s than limitn", $1, $5 + 0> limit ? "bigger" : "smaller")}' limit="${LIMIT-50}"
尽管这样做可能更有意义:
df -Ph | awk 'NR>1 && $5 + 0 > limit {print $1 " is over limit" > "/dev/stderr"}' limit="${LIMIT-50}"
注意,如果df
的输出的任何一列包含空白(例如"map auto_home"(,则这两种方法都会严重失败。df
的输出是供人类消费的,并不真正适合这类东西。您可以在awk中进行列计数(或者使用$(NF-1)
而不是$5
(,并以这种方式获得Capacity,但这只是移动了脆弱性。