Shell脚本显示美元$的语法错误


#!/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,但这只是移动了脆弱性。

最新更新