Unix Bash脚本-未找到命令

Unix Bash脚本-未找到命令,bash,function,shell,unix,directory,Bash,Function,Shell,Unix,Directory,因此,我正在研究一个简单的目录大小函数,它假设接收目录的输入,并告诉您它的大小,以及它是大于还是小于1KB。我以前收到过帮助,但是在修改代码后,我得到一个错误,说找不到命令。这没有意义,因为命令语法非常好 #!/bin/bash # GNU bash, version 4.3.46 function checkSize(){ #while the directory exists and size is greater than 1 while [ -

因此,我正在研究一个简单的目录大小函数,它假设接收目录的输入,并告诉您它的大小,以及它是大于还是小于1KB。我以前收到过帮助,但是在修改代码后,我得到一个错误,说找不到命令。这没有意义,因为命令语法非常好

#!/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"
语法是正确的,但它会抛出该错误

语法是正确的,但它会抛出该错误

不,语法不正确。使用
$(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目录
。禁用人类可读格式以删除
k
m
g
。。。后缀,然后使用
cut-f1
仅提取数字

此外,您不需要循环<代码>同时重复<代码>如果只运行一次。使用
if
还可以使用
else
分支

语法是正确的,但它会抛出该错误

不,语法不正确。使用
$(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目录
。禁用人类可读格式以删除
k
m
g
。。。后缀,然后使用
cut-f1
仅提取数字

此外,您不需要循环<代码>同时重复<代码>如果只运行一次。使用
if
还可以使用
else
分支。

试试

while [ -d "$varDirectory" ] && [ $(du -s $varDirectory|cut -f 1) -gt "$minimumsize" ]
我建议省略
-h
(=“人类可读”)选项
du
,因为像
299M
这样的字符串很难比较。

试试看

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

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

噢,snap,我没有注意到,这修复了我的错误,谢谢。只是一个简单的问题,你知道为什么它总是告诉我,即使目录大小为299m,它的输出值也小于1吗?@Kayenine请看Bodo的答案。我假设
-gt
du
命令的一部分,但显然您想在
[…-gt…]
内部使用
du
的输出。噢,快照,我没有注意到,这修复了我的错误,谢谢。只是一个简单的问题,你知道为什么它总是告诉我,即使目录大小为299m,它的输出值也小于1吗?@Kayenine请看Bodo的答案。我假设
-gt
du
命令的一部分,但显然您希望在
[…-gt…]
内部使用
du
的输出。这会引发此错误,[:太多了arguments@Kayenine:你说得对。我忘了从
du
输出中删除目录名。我编辑了我的答案。这会引发此错误,[:太多arguments@Kayenine:你说得对。我忘了从
du
输出中删除目录名。我编辑了我的答案。另请参见,(U&L.SE),(SO),(AskU),等等。另见,(U&L.SE),(SO),(AskU)等。