Unix Bash脚本-找不到命令

时间:2018-12-10 13:09:44

标签: bash function shell unix directory

因此,我正在研究一个简单的目录大小函数,该函数假定接受目录的输入并告诉您其大小,以及该大小是大于还是小于1 kb。我以前收到过帮助,但是,在修改我的代码后,我收到一条错误消息,提示未找到命令。这是没有意义的,因为命令语法非常好。

#!/bin/bash
# GNU bash, version 4.3.46


    function checkSize(){
        #while the directory exists and size is greater than 1
        while [ -d "$varDirectory" ] && $(du -sh $varDirectory) -gt "$minimumsize"
        do
            echo "$varDirectory is greater then 1kb"
        done
        #while the directory size is less than 1
        while [ -d "$varDirectory" ] && $(du -sh $varDirectory) -lt "$minimumsize"
        do
            echo "$varDirectory is less than 1kb"
            exit
        done
    }

输入目录后出现以下错误

./testing.sh: line 19: 299M: command not found
./testing.sh: line 24: 299M: command not found

此错误是针对以下几行

while [ -d "$varDirectory" ] && $(du -sh $varDirectory) -gt "$minimumsize" 
while [ -d "$varDirectory" ] && $(du -sh $varDirectory) -lt "$minimumsize"

语法正确,但是会引发该错误。

2 个答案:

答案 0 :(得分:3)

  

语法正确,但是会引发该错误。

否,语法不正确。使用$(du -sh $varDirectory) -gt "$minimumsize",您正在运行命令du -sh $varDirectory,然后获取其输出,并再次将输出作为命令运行。在您的情况下,输出以299M开始,因此bash抱怨找不到299M命令。

您可能想写

if [ -d "$varDirectory" ] &&
   [ $(du -s "$varDirectory" | cut -f1) -gt "$minimumsize" ]
then
    echo "greater than $minimumsize"
else
    echo "less than or equal $minimumsize or not a directory"
fi

请注意,您只能比较数字。但是,du -sh的输出不是数字,而是类似299m directory的输出。禁用人类可读的格式以删除kmg,...后缀,然后使用cut -f1仅提取数字。

您也不需要循环。 while重复。 if仅运行一次。借助if,您还可以使用else分支。

答案 1 :(得分:0)

尝试

while [ -d "$varDirectory" ] && [ $(du -s $varDirectory|cut -f 1) -gt "$minimumsize" ]

我建议省略-h的{​​{1}}(=“人类可读”)选项,因为类似du这样的字符串很难比较。