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

Shell Script Showing syntax error for dollar $

#!/bin/bash    

LIMIT='50'     
DIR="( $(df -Ph | column -t | awk '{print }' | grep -v Use) )"        
for i in $DIR;    
do    
    USED=$(df -Ph $i | awk '{print }' | 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 limit\n", ,  + 0> limit ? "bigger" : "smaller")}' limit="${LIMIT-50}"

尽管这样做可能更有意义:

df -Ph | awk 'NR>1 &&  + 0 > limit {print  " is over limit" > "/dev/stderr"}' limit="${LIMIT-50}"

请注意,如果 df 的输出的任何列包含空格(例如“map auto_home”),这两个操作都会严重失败。 df 的输出是供人类使用的,并不真正适合这种事情。您可以在 awk 中进行列计数(或使用 $(NF-1) 而不是 )并以这种方式获得容量,但这只是移动了脆弱性。